diff --git a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/Crypto.java b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/Crypto.java index b6b94603..654e86b4 100644 --- a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/Crypto.java +++ b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/Crypto.java @@ -130,6 +130,12 @@ public final class Crypto { return new CryptoProviderInfo(pd.getFullName(), algorithms); } + /** + * 返回指定名称的密码服务提供者;如果不存在,则返回 null ; + * + * @param providerFullName + * @return + */ public static CryptoProvider getProvider(String providerFullName) { Provider pd = pm.getProvider(CryptoService.class, providerFullName); if (pd == null) { diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java index 1939e36b..2b905d6b 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java @@ -13,17 +13,17 @@ public class CryptoConfig implements CryptoSetting { private short hashAlgorithm; private boolean autoVerifyHash; - + HashMap providers; HashMap nameAlgorithms; HashMap codeAlgorithms; - public CryptoConfig() { } public CryptoConfig(CryptoSetting setting) { - this.hashAlgorithm = setting.getHashAlgorithm(); + setSupportedProviders(setting.getSupportedProviders()); + setHashAlgorithm(setting.getHashAlgorithm()); this.autoVerifyHash = setting.getAutoVerifyHash(); } @@ -68,10 +68,10 @@ public class CryptoConfig implements CryptoSetting { providers.put(cryptoProvider.getName(), cryptoProvider); } } - this.providers = providers; + this.providers = providers; this.nameAlgorithms = nameAlgorithms; this.codeAlgorithms = codeAlgorithms; - + this.cryptoProviders = supportedProviders; } @@ -81,7 +81,7 @@ public class CryptoConfig implements CryptoSetting { public void setHashAlgorithm(short hashAlgorithm) { if (codeAlgorithms == null || !codeAlgorithms.containsKey(hashAlgorithm)) { - throw new LedgerException("The specified algorithm has no provider!"); + throw new LedgerException("The specified algorithm[" + hashAlgorithm + "] has no provider!"); } this.hashAlgorithm = hashAlgorithm; } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java index 93842206..4525ed9d 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java @@ -3,10 +3,15 @@ package com.jd.blockchain.ledger.core.impl; import java.util.HashMap; import java.util.Map; +import com.jd.blockchain.crypto.Crypto; +import com.jd.blockchain.crypto.CryptoAlgorithm; +import com.jd.blockchain.crypto.CryptoProvider; import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.ledger.CryptoSetting; import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.core.LedgerConsts; import com.jd.blockchain.ledger.core.LedgerEditor; +import com.jd.blockchain.ledger.core.LedgerException; import com.jd.blockchain.ledger.core.LedgerManage; import com.jd.blockchain.ledger.core.LedgerRepository; import com.jd.blockchain.storage.service.ExPolicyKVStorage; @@ -57,26 +62,83 @@ public class LedgerManager implements LedgerManage { @Override public LedgerRepository register(HashDigest ledgerHash, KVStorageService storageService) { + // 加载账本数据库; VersioningKVStorage ledgerVersioningStorage = storageService.getVersioningKVStorage(); ExPolicyKVStorage ledgerExPolicyStorage = storageService.getExPolicyKVStorage(); LedgerRepository ledgerRepo = new LedgerRepositoryImpl(ledgerHash, LEDGER_PREFIX, ledgerExPolicyStorage, ledgerVersioningStorage); - LedgerRepositoryContext ledgerCtx = new LedgerRepositoryContext(); - ledgerCtx.ledgerRepo = ledgerRepo; - ledgerCtx.storageService = storageService; + // 校验 crypto service provider ; + CryptoSetting cryptoSetting = ledgerRepo.getAdminAccount().getSetting().getCryptoSetting(); + checkCryptoSetting(cryptoSetting, ledgerHash); + + // 创建账本上下文; + LedgerRepositoryContext ledgerCtx = new LedgerRepositoryContext(ledgerRepo, storageService); ledgers.put(ledgerHash, ledgerCtx); return ledgerRepo; } + /** + * 检查账本的密码参数设置与本地节点的运行时环境是否匹配; + * + * @param cryptoSetting + * @param ledgerHash + */ + private void checkCryptoSetting(CryptoSetting cryptoSetting, HashDigest ledgerHash) { + CryptoProvider[] cryptoProviders = cryptoSetting.getSupportedProviders(); + if (cryptoProviders == null || cryptoProviders.length == 0) { + throw new LedgerException("No supported crypto service providers has been setted in the ledger[" + + ledgerHash.toBase58() + "]!"); + } + for (CryptoProvider cp : cryptoProviders) { + CryptoProvider regCp = Crypto.getProvider(cp.getName()); + checkCryptoProviderConsistency(regCp, cp); + } + } + + /** + * 检查密码服务提供者的信息是否匹配; + * + * @param registeredProvider + * @param settingProvider + */ + private void checkCryptoProviderConsistency(CryptoProvider registeredProvider, CryptoProvider settingProvider) { + if (registeredProvider == null) { + throw new LedgerException("Crypto service provider[" + settingProvider.getName() + + "] has not registered in the runtime environment of current peer!"); + } + + CryptoAlgorithm[] runtimeAlgothms = registeredProvider.getAlgorithms(); + CryptoAlgorithm[] settingAlgothms = settingProvider.getAlgorithms(); + if (runtimeAlgothms.length != settingAlgothms.length) { + throw new LedgerException("Crypto service provider[" + settingProvider.getName() + + "] has not registered in runtime of current peer!"); + } + HashMap runtimeAlgothmMap = new HashMap(); + for (CryptoAlgorithm alg : runtimeAlgothms) { + runtimeAlgothmMap.put(alg.code(), alg); + } + for (CryptoAlgorithm alg : settingAlgothms) { + CryptoAlgorithm regAlg = runtimeAlgothmMap.get(alg.code()); + if (regAlg == null) { + throw new LedgerException( + String.format("Crypto algorithm[%s] is not defined by provider[%s] in runtime of current peer!", + alg.toString(), registeredProvider.getName())); + } + if (!regAlg.name().equals(alg.name())) { + throw new LedgerException(String.format( + "Crypto algorithm[%s] do not match the same code algorithm[%s] defined by provider[%s] in runtime of current peer!", + CryptoAlgorithm.getString(alg), CryptoAlgorithm.getString(regAlg), + registeredProvider.getName())); + } + } + } + @Override public void unregister(HashDigest ledgerHash) { - LedgerRepositoryContext ledgerCtx = ledgers.get(ledgerHash); + LedgerRepositoryContext ledgerCtx = ledgers.remove(ledgerHash); if (ledgerCtx != null) { ledgerCtx.ledgerRepo.close(); - ledgers.remove(ledgerHash); - ledgerCtx.ledgerRepo = null; - ledgerCtx.storageService = null; } } @@ -88,18 +150,6 @@ public class LedgerManager implements LedgerManage { */ @Override public LedgerEditor newLedger(LedgerInitSetting initSetting, KVStorageService storageService) { - // GenesisLedgerStorageProxy genesisStorageProxy = new - // GenesisLedgerStorageProxy(); - // BufferedKVStorage bufferedStorage = new - // BufferedKVStorage(genesisStorageProxy, genesisStorageProxy, false); - - // LedgerEditor genesisBlockEditor = - // LedgerTransactionalEditor.createEditor(initSetting, - // bufferedStorage, bufferedStorage); - - // return new LedgerInitializer(genesisBlockEditor, bufferedStorage, - // genesisStorageProxy, storageService, this); - LedgerEditor genesisBlockEditor = LedgerTransactionalEditor.createEditor(initSetting, LEDGER_PREFIX, storageService.getExPolicyKVStorage(), storageService.getVersioningKVStorage()); return genesisBlockEditor; @@ -110,10 +160,16 @@ public class LedgerManager implements LedgerManage { return LEDGER_PREFIX + base58LedgerHash + LedgerConsts.KEY_SEPERATOR; } + private static class LedgerRepositoryContext { - private LedgerRepository ledgerRepo; + public final LedgerRepository ledgerRepo; - private KVStorageService storageService; + public final KVStorageService storageService; + + public LedgerRepositoryContext(LedgerRepository ledgerRepo, KVStorageService storageService) { + this.ledgerRepo = ledgerRepo; + this.storageService = storageService; + } } } diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java index 066151cd..9819c9b3 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java @@ -57,6 +57,7 @@ public class LedgerManagerTest { DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(BlockBody.class); + DataContractRegistry.register(CryptoProvider.class); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoSetting.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoSetting.java index 373fd1b3..9f24322c 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoSetting.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoSetting.java @@ -20,6 +20,7 @@ public interface CryptoSetting { * * @return */ + @DataField(order = 0, refContract = true, list = true) public CryptoProvider[] getSupportedProviders(); diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/LedgerBindingConfigAware.java b/source/peer/src/main/java/com/jd/blockchain/peer/LedgerBindingConfigAware.java index c0bb263b..e8b244c6 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/LedgerBindingConfigAware.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/LedgerBindingConfigAware.java @@ -4,8 +4,6 @@ import com.jd.blockchain.consensus.service.NodeServer; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.tools.initializer.LedgerBindingConfig; -import java.util.List; - public interface LedgerBindingConfigAware { void setConfig(LedgerBindingConfig config); diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java b/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java index 0e8c863e..ac95d361 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java @@ -5,10 +5,6 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import javax.annotation.PostConstruct; -import javax.annotation.PreDestroy; - -import com.jd.blockchain.ledger.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -35,6 +31,21 @@ import com.jd.blockchain.consensus.service.NodeServer; import com.jd.blockchain.consensus.service.ServerSettings; import com.jd.blockchain.consensus.service.StateMachineReplicate; import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.ledger.ContractCodeDeployOperation; +import com.jd.blockchain.ledger.ContractEventSendOperation; +import com.jd.blockchain.ledger.CryptoSetting; +import com.jd.blockchain.ledger.DataAccountKVSetOperation; +import com.jd.blockchain.ledger.DataAccountRegisterOperation; +import com.jd.blockchain.ledger.EndpointRequest; +import com.jd.blockchain.ledger.LedgerBlock; +import com.jd.blockchain.ledger.LedgerInitOperation; +import com.jd.blockchain.ledger.NodeRequest; +import com.jd.blockchain.ledger.Operation; +import com.jd.blockchain.ledger.TransactionContent; +import com.jd.blockchain.ledger.TransactionContentBody; +import com.jd.blockchain.ledger.TransactionRequest; +import com.jd.blockchain.ledger.TransactionResponse; +import com.jd.blockchain.ledger.UserRegisterOperation; import com.jd.blockchain.ledger.core.LedgerAdminAccount; import com.jd.blockchain.ledger.core.LedgerManage; import com.jd.blockchain.ledger.core.LedgerRepository; @@ -68,35 +79,17 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag public static final int MIN_GATEWAY_ID = 10000; - // @Autowired - // private PeerSettings peerSetting; - -// @Autowired -// private ConsensusTransactionService consensusService; - - // private ConsensusPeer consensusReplica; - @Autowired private LedgerManage ledgerManager; @Autowired private DbConnectionFactory connFactory; - // private Map ledgerConns = new - // ConcurrentHashMap<>(); - private Map ledgerTxConverters = new ConcurrentHashMap<>(); private Map ledgerPeers = new ConcurrentHashMap<>(); private Map ledgerCryptoSettings = new ConcurrentHashMap<>(); - // private Map nodeRealms = new - // ConcurrentHashMap<>(); - - // private Map ledgerRealms = new - // ConcurrentHashMap<>(); - // private Map ledgerRealmsNoConflict = new - // ConcurrentHashMap<>(); private LedgerBindingConfig config; @@ -106,9 +99,6 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag @Autowired private StateMachineReplicate consensusStateManager; - // private static int step = 0; - // private static int temp = 0; - static { DataContractRegistry.register(LedgerInitOperation.class); DataContractRegistry.register(LedgerBlock.class); @@ -134,24 +124,6 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag } - @PostConstruct - private void init() { - - } - - @PreDestroy - private void destroy() { -// DbConnection[] conns = ledgerConns.values().toArray(new DbConnection[ledgerConns.size()]); -// ledgerConns.clear(); -// for (DbConnection conn : conns) { -// try { -// conn.close(); -// } catch (Exception e) { -// // Ignore; -// } -// } - } - /** * 接入认证; * @@ -234,42 +206,8 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag HashDigest[] ledgerHashs = config.getLedgerHashs(); for (HashDigest ledgerHash : ledgerHashs) { setConfig(config,ledgerHash); -// LedgerBindingConfig.BindingConfig bindingConfig = config.getLedger(ledgerHash); -// DbConnection dbConnNew = connFactory.connect(bindingConfig.getDbConnection().getUri(), -// bindingConfig.getDbConnection().getPassword()); -// LedgerRepository ledgerRepository = ledgerManager.register(ledgerHash, dbConnNew.getStorageService()); -// -// // load provider; -// LedgerAdminAccount ledgerAdminAccount = ledgerRepository.getAdminAccount(); -// String consensusProvider = ledgerAdminAccount.getSetting().getConsensusProvider(); -// ConsensusProvider provider = ConsensusProviders.getProvider(consensusProvider); -// // find current node; -// Bytes csSettingBytes = ledgerAdminAccount.getSetting().getConsensusSetting(); -// ConsensusSettings csSettings = provider.getSettingsFactory().getConsensusSettingsEncoder() -// .decode(csSettingBytes.toBytes()); -// NodeSettings currentNode = null; -// for (NodeSettings nodeSettings : csSettings.getNodes()) { -// if (nodeSettings.getAddress().equals(bindingConfig.getParticipant().getAddress())) { -// currentNode = nodeSettings; -// } -// } -// if (currentNode == null) { -// throw new IllegalArgumentException( -// "Current node is not found from the consensus settings of ledger[" + ledgerHash.toBase58() -// + "]!"); -// } -// ServerSettings serverSettings = provider.getServerFactory().buildServerSettings(ledgerHash.toBase58(), csSettings, currentNode.getAddress()); -// -// NodeServer server = provider.getServerFactory().setupServer(serverSettings, consensusMessageHandler, -// consensusStateManager); -// ledgerPeers.put(ledgerHash, server); -// ledgerCryptoSettings.put(ledgerHash, ledgerAdminAccount.getSetting().getCryptoSetting()); - } - // remove duplicate consensus realm,and establish consensus peer and consensus - // realm corresponding relationship - // initBindingConfig(config); this.config = config; } catch (Exception e) { @@ -314,46 +252,6 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag return server; } - // private void initBindingConfig(LedgerBindingConfig config) { - // boolean intersection = false; - // // to remove intersection consensus realm - // for (HashDigest hashDigest : ledgerRealms.keySet()) { - // ConsensusRealm consensusRealm1i = ledgerRealms.get(hashDigest); - // for (ConsensusRealm consensusRealm1j : ledgerRealms.values()) { - // // avoid compare with myself - // if (consensusRealm1i.equals(consensusRealm1j)) { - // continue; - // } - // if (consensusRealm1i.hasIntersection(consensusRealm1j)) { - // intersection = true; - // break; - // } - // } - // // prompt consensus realm conflict info - // if (intersection == true) { - // ConsoleUtils.info("\r\nconsensus realm intersection with other consensus - // realm\r\n"); - // continue; - // } - // if (intersection == false) { - // // add consensus realm without conflict to ledgerRealmsNoConflict - // ledgerRealmsNoConflict.put(hashDigest, consensusRealm1i); - // - // // String consensusSystemFile = - // config.getLedger(hashDigest).getCsConfigFile(); - // int currentId = config.getLedger(hashDigest).getParticipant().getId(); - // // init consensusSystemConfig; - // ConsensusProperties csProps = - // ConsensusProperties.resolve(consensusRealm1i.getSetting()); - // ConsensusPeer consensusPeer = new ConsensusPeer(consensusRealm1i, currentId, - // consensusService, - // csProps.getProperties()); - // ledgerPeers.put(hashDigest, consensusPeer); - // } - // } // END OF FOR:get ledgerRealmsNoConflict and ledgerPeers - // - // } - @Override public ConsensusRealm[] getRealms() { throw new IllegalStateException("Not implemented!"); @@ -364,45 +262,6 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag for (NodeServer peer : ledgerPeers.values()) { runRealm(peer); } - // try { - // - // // for (ConsensusPeer peer : ledgerPeers.values()) { - // for (Map.Entry entry : ledgerPeers.entrySet()) { - // HashDigest ledgerHash = entry.getKey(); - // ConsensusPeer peer = entry.getValue(); - // // TODO: 多线程启动; - // ConsensusNode[] nodes = peer.getConsensusRealm().getNodes(); - // StringBuilder consensusInfo = new StringBuilder(); - // for (ConsensusNode node : nodes) { - // consensusInfo.append( - // String.format("[%s]-%s; ", node.getAddress(), - // node.getConsensusAddress().toString())); - // } - // LOGGER.debug(String.format("-------- start consensus peer[Id=%s] --Nodes=%s - // -------------", - // peer.getCurrentId(), consensusInfo.toString())); - // peer.start(); - // // 设置消息队列 - // MsgQueueMessageDispatcher messageDispatcher = ledgerTxConverters.get(ledgerHash); - // - // if (messageDispatcher == null) { - // LedgerBindingConfig.BindingConfig bindingConfig = - // this.config.getLedger(ledgerHash); - // MQConnectionConfig mqConnection = bindingConfig.getMqConnection(); - // if (mqConnection != null && mqConnection.getServer() != null) { - // MessageQueueConfig mqConfig = new - // MessageQueueConfig(mqConnection.getServer(), - // mqConnection.getTopic()); - // messageDispatcher = MessageDispatcherFactory.newInstance(mqConfig, peer); - // Executors.newSingleThreadExecutor().execute(messageDispatcher); // 启动监听 - // } - // } - // } - // } catch (Exception e) { - // LOGGER.error("Error occurred on starting all consensus realms! --" + - // e.getMessage(), e); - // throw new IllegalStateException(e.getMessage(), e); - // } } @Override diff --git a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java index 66868f66..98dc5523 100644 --- a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java +++ b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java @@ -45,6 +45,9 @@ public class LedgerInitProperties { // 共识服务提供者;必须; public static final String CONSENSUS_SERVICE_PROVIDER = "consensus.service-provider"; + + // 密码服务提供者列表,以英文逗点“,”分隔;必须; + public static final String CRYPTO_SERVICE_PROVIDER = "crypto.service-providers"; private byte[] ledgerSeed;