diff --git a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClient.java b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClient.java index 25a995c7..9561263d 100644 --- a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClient.java +++ b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartConsensusClient.java @@ -20,8 +20,6 @@ public class BftsmartConsensusClient implements ConsensusClient { this.clientSettings = clientSettings; this.gatewayId = clientSettings.getClientId(); - - connect(); } @@ -45,7 +43,7 @@ public class BftsmartConsensusClient implements ConsensusClient { } @Override - public void connect() { + public synchronized void connect() { //consensus client pool BftsmartPeerProxyFactory peerProxyFactory = new BftsmartPeerProxyFactory((BftsmartClientSettings)clientSettings, gatewayId); diff --git a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartMessageService.java b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartMessageService.java index a80375a4..53a5f0a8 100644 --- a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartMessageService.java +++ b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/client/BftsmartMessageService.java @@ -27,16 +27,16 @@ public class BftsmartMessageService implements MessageService { 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(wrapMsg); +// //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) { diff --git a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartConsensusManageService.java b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartConsensusManageService.java index a91f3f16..215486d0 100644 --- a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartConsensusManageService.java +++ b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartConsensusManageService.java @@ -13,10 +13,16 @@ import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils; public class BftsmartConsensusManageService implements ConsensusManageService { - public static final int CLIENT_RANGE = 100 * 1000; + 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) { @@ -41,6 +47,7 @@ public class BftsmartConsensusManageService implements ConsensusManageService { try { authLock.lock(); ((BftsmartClientIncomingConfig) clientIncomingSettings).setClientId(clientId++); + clientId += CLIENT_SIZE_PER_GATEWAY; } finally { authLock.unlock(); } diff --git a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java index 635c0758..ce97797a 100644 --- a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java +++ b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/service/BftsmartNodeServer.java @@ -1,16 +1,13 @@ package com.jd.blockchain.consensus.bftsmart.service; import java.io.ByteArrayOutputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; - +import bftsmart.tom.*; 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; @@ -26,13 +23,8 @@ import com.jd.blockchain.ledger.TransactionState; 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.MessageContext; -import bftsmart.tom.ReplyContext; -import bftsmart.tom.ReplyContextMessage; -import bftsmart.tom.ServiceReplica; import bftsmart.tom.core.messages.TOMMessage; import bftsmart.tom.server.defaultservices.DefaultRecoverable; @@ -42,15 +34,9 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer private List stateHandles = new CopyOnWriteArrayList<>(); -// private List batchConsensusListeners = new LinkedList<>(); - -// private Map> replyContextMessages = new ConcurrentHashMap<>(); - // TODO 暂不处理队列溢出问题 private ExecutorService notifyReplyExecutors = Executors.newSingleThreadExecutor(); -// private ExecutorService sendCommitExecutors = Executors.newFixedThreadPool(2); - private volatile Status status = Status.STOPPED; private final Object mutex = new Object(); @@ -81,28 +67,6 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer private int serverId; -// private volatile String batchId = null; -// -//// private List> replyMessages ; -// -// private boolean leader_has_makedicision = false; -// -// private boolean commit_block_condition = false; -// -// private final AtomicLong txIndex = new AtomicLong(); -// -// private final AtomicLong blockIndex = new AtomicLong(); -// -// private static final AtomicInteger incrementNum = new AtomicInteger(); -// -//// private final BlockingQueue txRequestQueue = new LinkedBlockingQueue(); -// -// private final ExecutorService queueExecutor = Executors.newSingleThreadExecutor(); -// -// private final ScheduledExecutorService timerEexecutorService = new ScheduledThreadPoolExecutor(10); -// private ServiceProxy peerProxy; - - public BftsmartNodeServer() { } @@ -113,28 +77,12 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer //used later this.stateMachineReplicate = stateMachineReplicate; this.messageHandle = messageHandler; - this.manageService = new BftsmartConsensusManageService(this); createConfig(); serverId = findServerId(); initConfig(serverId, systemConfig, hostsConfig); + this.manageService = new BftsmartConsensusManageService(this); } - //aim to send commit block message -// protected void createProxyClient() { -// BftsmartTopology topologyCopy = (BftsmartTopology) topology.copyOf(); -// -// MemoryBasedViewStorage viewStorage = new MemoryBasedViewStorage(topologyCopy.getView()); -// -// byte[] bytes = BinarySerializeUtils.serialize(tomConfig); -// -// TOMConfiguration decodeTomConfig = BinarySerializeUtils.deserialize(bytes); -// -// decodeTomConfig.setProcessId(0); -// -// peerProxy = new ServiceProxy(decodeTomConfig, viewStorage, null, null); -// -// } - protected int findServerId() { int serverId = 0; @@ -242,214 +190,12 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer return appExecuteBatch(commands, msgCtxs, fromConsensus, null); } -// private boolean checkLeaderId(MessageContext[] msgCtxs) { -// boolean result = false; -// -// for (int i = 0; i < msgCtxs.length - 1; i++) { -// if (msgCtxs[i].getLeader() != msgCtxs[i+1].getLeader()) -// return result; -// } -// -// result = true; -// -// return result; -// } -// -// //普通消息处理 -// private void normalMsgProcess(ReplyContextMessage replyContextMsg, byte[] msg, String realmName, String batchId) { -// AsyncFuture replyMsg = messageHandle.processOrdered(replyContextMsg.getMessageContext().getOperationId(), msg, realmName, batchId); -// replyContextMessages.put(replyContextMsg, replyMsg); -// } -// -// //结块消息处理 -// private void commitMsgProcess(ReplyContextMessage replyContextMsg, String realmName, String batchId) { -// try{ -// //receive messages before commitblock message, then execute commit -// if (replyContextMessages.size() != 0) { -// messageHandle.completeBatch(realmName, batchId); -// messageHandle.commitBatch(realmName, batchId); -// } -// -// // commit block msg need response too -// CompletableAsyncFuture asyncFuture = new CompletableAsyncFuture<>(); -// TransactionResponse transactionRespHandle = new TransactionRespHandle(newBlockCommitRequest(), -// TransactionState.SUCCESS, TransactionState.SUCCESS); -// -// asyncFuture.complete(BinaryEncodingUtils.encode(transactionRespHandle, TransactionResponse.class)); -// replyContextMessages.put(replyContextMsg, asyncFuture); -// }catch (Exception e){ -// LOGGER.error("Error occurred on commit batch transactions, so the new block is canceled! --" + e.getMessage(), e); -// messageHandle.rollbackBatch(realmName, batchId, -1); -// }finally{ -// this.batchId = null; -// } -// } - -// private void sendCommitMessage() { -// -// HashDigest ledgerHash = new HashDigest(Base58Utils.decode(realmName)); -// -// BlockchainKeyPair userKeyPeer = BlockchainKeyGenerator.getInstance().generate(); -// -// TxContentBlob txContentBlob = new TxContentBlob(ledgerHash); -// -// byte[] reqBytes = BinaryEncodingUtils.encode(txContentBlob, TransactionContent.class); -// -// HashDigest reqHash = CryptoUtils.hash(CryptoAlgorithm.SHA256).hash(reqBytes); -// -// txContentBlob.setHash(reqHash); -// -// TxRequestMessage transactionRequest = new TxRequestMessage(txContentBlob); -// -// byte[] msg = BinaryEncodingUtils.encode(transactionRequest, TransactionRequest.class); -// -// byte[] type = BytesUtils.toBytes(1); -// -// byte[] wrapMsg = new byte[msg.length + 4]; -// -// System.arraycopy(type, 0, wrapMsg, 0, 4); -// System.arraycopy(msg, 0, wrapMsg, 4, msg.length); -// -// peerProxy.invokeOrdered(wrapMsg); -// -// LOGGER.info("Send commit block msg success!"); -// } - -// private TransactionRequest newBlockCommitRequest() { -// -// HashDigest ledgerHash = new HashDigest(Base58Utils.decode(realmName)); -// -// TxContentBlob txContentBlob = new TxContentBlob(ledgerHash); -// -// byte[] reqBytes = BinaryEncodingUtils.encode(txContentBlob, TransactionContent.class); -// -// HashDigest reqHash = CryptoUtils.hash(CryptoAlgorithm.SHA256).hash(reqBytes); -// -// txContentBlob.setHash(reqHash); -// -// TxRequestMessage transactionRequest = new TxRequestMessage(txContentBlob); -// -// return transactionRequest; -// } - -// private void checkConsensusFinish() { -// BftsmartCommitBlockSettings commitBlockSettings = ((BftsmartServerSettings)serverSettings).getConsensusSettings().getCommitBlockSettings(); -// int txSize = commitBlockSettings.getTxSizePerBlock(); -// long maxDelay = commitBlockSettings.getMaxDelayMilliSecondsPerBlock(); -// -// long currIndex = txIndex.incrementAndGet(); -// if (currIndex == txSize) { -// txIndex.set(0); -// this.blockIndex.getAndIncrement(); -// sendCommitExecutors.execute(()-> { -// sendCommitMessage(); -// }); -// } else if (currIndex == 1) { -//// System.out.printf("checkConsensusFinish schedule blockIndex = %s \r\n", this.blockIndex.get()); -// timerEexecutorService.schedule(timeTask(this.blockIndex.get()), maxDelay, TimeUnit.MILLISECONDS); -// } -// -// return; -// } - -// @Override -// public byte[][] appExecuteBatch(byte[][] commands, MessageContext[] msgCtxs, boolean fromConsensus, List replyList) { -// -// if (!checkLeaderId(msgCtxs)) { -// throw new IllegalArgumentException(); -// } -// -// boolean isLeader = (msgCtxs[0].getLeader() == getId()); -// -// if (isLeader) { -// for (int i = 0; i < commands.length; i++) { -// byte[] wrapMsg = commands[i]; -// byte[] type = new byte[4]; -// byte[] msg= new byte[wrapMsg.length - 4]; -// -// System.arraycopy(wrapMsg, 0, type, 0, 4); -// System.arraycopy(wrapMsg, 4, msg, 0, wrapMsg.length - 4); -// -// MessageContext messageContext = msgCtxs[i]; -// ReplyContextMessage replyContextMessage = replyList.get(i); -// replyContextMessage.setMessageContext(messageContext); -// -// if (batchId == null) { -// batchId = messageHandle.beginBatch(realmName); -// } -// -// int msgType = BytesUtils.readInt(new ByteArrayInputStream(type)); -// -// if (msgType == 0) { -// -// //only leader do it -// checkConsensusFinish(); -// //normal message process -// normalMsgProcess(replyContextMessage, msg, realmName, batchId); -// } -// if (!leader_has_makedicision) { -// if (msgType == 1) { -// LOGGER.error("Error occurred on appExecuteBatch msg process, leader confilicting error!"); -// } -// -// if (commit_block_condition) { -// leader_has_makedicision = true; -// -//// sendCommitExecutors.execute(() -> { -// commit_block_condition = false; -// LOGGER.info("Txcount execute commit block!"); -// sendCommitMessage(); -//// }); -// -// } -// } else if (msgType == 1) { -// //commit block message -// commitMsgProcess(replyContextMessage, realmName, batchId); -// leader_has_makedicision = false; -// sendReplyMessage(); -// } -// } -// } else { -// for (int i = 0; i < commands.length; i++) { -// byte[] wrapMsg = commands[i]; -// byte[] type = new byte[4]; -// byte[] msg= new byte[wrapMsg.length - 4]; -// -// System.arraycopy(wrapMsg, 0, type, 0, 4); -// System.arraycopy(wrapMsg, 4, msg, 0, wrapMsg.length - 4); -// -// MessageContext messageContext = msgCtxs[i]; -// ReplyContextMessage replyContextMessage = replyList.get(i); -// replyContextMessage.setMessageContext(messageContext); -// -// if (batchId == null) { -// batchId = messageHandle.beginBatch(realmName); -// } -// -// int msgType = BytesUtils.readInt(new ByteArrayInputStream(type)); -// -// if (msgType == 0) { -// //normal message -// normalMsgProcess(replyContextMessage, msg, realmName, batchId); -// } else if (msgType == 1) { -// // commit block message -// commitMsgProcess(replyContextMessage, realmName, batchId); -// sendReplyMessage(); -// } -// } -// } -// -// return null; -// } - @Override public byte[][] appExecuteBatch(byte[][] commands, MessageContext[] msgCtxs, boolean fromConsensus, List replyList) { if (replyList == null || replyList.size() == 0) { throw new IllegalArgumentException(); } - - // todo 此部分需要重新改造 /** * 默认BFTSmart接口提供的commands是一个或多个共识结果的顺序集合 @@ -481,52 +227,6 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer if (!manageConsensusCmds.isEmpty()) { blockAndReply(manageConsensusCmds, manageReplyMsgs); } - - -//// if (!checkLeaderId(msgCtxs)) { -//// throw new IllegalArgumentException(); -//// } -// -// if (replyList == null || replyList.size() == 0) { -// throw new IllegalArgumentException(); -// } -// -// for (int i = 0; i < commands.length; i++) { -// byte[] wrapMsg = commands[i]; -// byte[] type = new byte[4]; -// byte[] msg= new byte[wrapMsg.length - 4]; -// // batch messages, maybe in different consensus instance, leader also maybe different -// boolean isLeader = (msgCtxs[i].getLeader() == getId()); -// -// System.arraycopy(wrapMsg, 0, type, 0, 4); -// System.arraycopy(wrapMsg, 4, msg, 0, wrapMsg.length - 4); -// -// MessageContext messageContext = msgCtxs[i]; -// ReplyContextMessage replyContextMessage = replyList.get(i); -// replyContextMessage.setMessageContext(messageContext); -// -// if (batchId == null) { -// batchId = messageHandle.beginBatch(realmName); -// } -// -// int msgType = BytesUtils.readInt(new ByteArrayInputStream(type)); -// -// if (msgType == 0) { -// -// //only leader do it -// if (isLeader) { -// checkConsensusFinish(); -// } -// //normal message process -// normalMsgProcess(replyContextMessage, msg, realmName, batchId); -// } -// else if (msgType == 1) { -// //commit block message -// commitMsgProcess(replyContextMessage, realmName, batchId); -// sendReplyMessage(); -// } -// } - return null; } @@ -574,46 +274,6 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer }); } -// private void sendReplyMessage() { -// for (ReplyContextMessage msg: replyContextMessages.keySet()) { -// byte[] reply = replyContextMessages.get(msg).get(); -// msg.setReply(reply); -// 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()); -// // cs.send(new int[]{request.getSender()}, request.reply); -// } -// } -// replyContextMessages.clear(); -// } - -// private Runnable timeTask(final long currBlockIndex) { -// Runnable task = () -> { -// boolean isAdd = this.blockIndex.compareAndSet(currBlockIndex, currBlockIndex + 1); -// if (isAdd) { -// LOGGER.info("TimerTask execute commit block! "); -// this.txIndex.set(0); -// timerEexecutorService.execute(()-> { -// sendCommitMessage(); -// }); -// } -// }; -// return task; -// } - //notice public byte[] getSnapshot() { LOGGER.debug("------- GetSnapshot...[replica.id=" + this.getId() + "]"); @@ -623,9 +283,6 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer for (StateHandle stateHandle : stateHandles) { // TODO: 测试代码; return stateHandle.takeSnapshot(); - - // byte[] state = stateHandle.takeSnapshot(); - // BytesEncoding.writeInNormal(state, out); } return out.toByteArray(); } @@ -693,33 +350,6 @@ public class BftsmartNodeServer extends DefaultRecoverable implements NodeServer } } -// private static class ActionRequestExtend { -// -// -// ReplyContextMessage replyContextMessage; -// -// private byte[] message; -// -// private ActionRequest actionRequest; -// -// public ActionRequestExtend(byte[] message) { -// this.message = message; -// actionRequest = BinaryEncodingUtils.decode(message); -// } -// -// public byte[] getMessage() { -// return message; -// } -// -// public ReplyContextMessage getReplyContextMessage() { -// return replyContextMessage; -// } -// -// public ActionRequest getActionRequest() { -// return actionRequest; -// } -// } - enum Status { STARTING, diff --git a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/BaseCryptoKey.java b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/BaseCryptoKey.java index dd2726c7..95cfee3d 100644 --- a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/BaseCryptoKey.java +++ b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/BaseCryptoKey.java @@ -7,9 +7,9 @@ public abstract class BaseCryptoKey extends BaseCryptoBytes implements CryptoKey public static final int KEY_TYPE_BYTES = 1; private static final long serialVersionUID = 4543074827807908363L; - // public BaseCryptoKey() { - // super(); - // } + public BaseCryptoKey() { + super(); + } protected BaseCryptoKey(short algorithm, byte[] rawKeyBytes, CryptoKeyType keyType) { super(algorithm, CryptoBytesEncoding.encodeKeyBytes(rawKeyBytes, keyType)); diff --git a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PrivKey.java b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PrivKey.java index b15bb5e7..78af68c4 100644 --- a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PrivKey.java +++ b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PrivKey.java @@ -7,6 +7,7 @@ package com.jd.blockchain.crypto; * */ public class PrivKey extends BaseCryptoKey { + private static final long serialVersionUID = 6265440395252295646L; public PrivKey(short algorithm, byte[] rawCryptoBytes) { diff --git a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PubKey.java b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PubKey.java index ca5b43c8..3d59dd3a 100644 --- a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PubKey.java +++ b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/PubKey.java @@ -9,7 +9,11 @@ package com.jd.blockchain.crypto; public class PubKey extends BaseCryptoKey { private static final long serialVersionUID = -2055071197736385328L; - + + public PubKey() { + super(); + } + public PubKey(short algorithm, byte[] rawCryptoBytes) { super(algorithm, rawCryptoBytes, CryptoKeyType.PUBLIC); } diff --git a/source/deployment/deployment-peer/pom.xml b/source/deployment/deployment-peer/pom.xml index 9751b803..1d5f9fc5 100644 --- a/source/deployment/deployment-peer/pom.xml +++ b/source/deployment/deployment-peer/pom.xml @@ -25,6 +25,28 @@ runtime-modular-booter ${project.version} + + + com.jd.blockchain + storage-composite + ${project.version} + + + com.jd.blockchain + storage-service + ${project.version} + + + com.jd.blockchain + storage-redis + ${project.version} + + + com.jd.blockchain + storage-rocksdb + ${project.version} + + diff --git a/source/deployment/deployment-peer/src/main/resources/assembly.xml b/source/deployment/deployment-peer/src/main/resources/assembly.xml index d445b9cb..5e64c93e 100644 --- a/source/deployment/deployment-peer/src/main/resources/assembly.xml +++ b/source/deployment/deployment-peer/src/main/resources/assembly.xml @@ -62,15 +62,6 @@ true com.jd.blockchain:tools-initializer-booter - - - libs - false - - - - true - com.jd.blockchain:tools-keygen-booter diff --git a/source/gateway/pom.xml b/source/gateway/pom.xml index f21abfba..3150363e 100644 --- a/source/gateway/pom.xml +++ b/source/gateway/pom.xml @@ -15,6 +15,17 @@ consensus-framework ${project.version} + + com.jd.blockchain + consensus-bftsmart + ${project.version} + + + com.jd.blockchain + consensus-mq + ${project.version} + + com.jd.blockchain ledger-rpc @@ -43,11 +54,22 @@ ${project.version} + + com.jd.blockchain + crypto-framework + ${project.version} + + com.jd.blockchain crypto-classic ${project.version} - test + + + + com.jd.blockchain + crypto-sm + ${project.version} diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryService.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryService.java index 73b5d64e..6cd1828c 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryService.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryService.java @@ -2,6 +2,7 @@ package com.jd.blockchain.gateway.service; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.ledger.ParticipantNode; +import com.jd.blockchain.sdk.LedgerInitSettings; /** * queryService only for gateway; @@ -24,4 +25,13 @@ public interface GatewayQueryService { * @return */ ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash, int fromIndex, int count); + + /** + * 获取账本初始化配置信息 + * + * @param ledgerHash + * 账本Hash + * @return + */ + LedgerInitSettings getLedgerInitSettings(HashDigest ledgerHash); } diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceHandler.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceHandler.java new file mode 100644 index 00000000..71e34a7c --- /dev/null +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceHandler.java @@ -0,0 +1,144 @@ +package com.jd.blockchain.gateway.service; + +import com.jd.blockchain.consensus.ConsensusProvider; +import com.jd.blockchain.consensus.ConsensusProviders; +import com.jd.blockchain.consensus.ConsensusSettings; +import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider; +import com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider; +import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.gateway.PeerService; +import com.jd.blockchain.ledger.LedgerMetadata; +import com.jd.blockchain.ledger.ParticipantNode; +import com.jd.blockchain.sdk.LedgerInitSettings; +import com.jd.blockchain.utils.QueryUtil; +import com.jd.blockchain.utils.codec.HexUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import java.util.Arrays; + + +/** + * @Author zhaogw + * @Date 2019/2/22 10:39 + */ +@Component +public class GatewayQueryServiceHandler implements GatewayQueryService { + + @Autowired + private PeerService peerService; + + @Override + public HashDigest[] getLedgersHash(int fromIndex, int count) { + HashDigest ledgersHash[] = peerService.getQueryService().getLedgerHashs(); + int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex,count,ledgersHash.length); + HashDigest ledgersHashNew[] = Arrays.copyOfRange(ledgersHash,indexAndCount[0],indexAndCount[0]+indexAndCount[1]); + return ledgersHashNew; + } + + @Override + public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash, int fromIndex, int count) { + ParticipantNode participantNode[] = peerService.getQueryService().getConsensusParticipants(ledgerHash); + int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex,count,participantNode.length); + ParticipantNode participantNodesNew[] = Arrays.copyOfRange(participantNode,indexAndCount[0],indexAndCount[0]+indexAndCount[1]); + return participantNodesNew; + } + + @Override + public LedgerInitSettings getLedgerInitSettings(HashDigest ledgerHash) { + + ParticipantNode[] participantNodes = peerService.getQueryService().getConsensusParticipants(ledgerHash); + + LedgerMetadata ledgerMetadata = peerService.getQueryService().getLedgerMetadata(ledgerHash); + + return initLedgerInitSettings(participantNodes, ledgerMetadata); + } + + /** + * 初始化账本配置 + * + * @param participantNodes + * 参与方列表 + * @param ledgerMetadata + * 账本元数据 + * @return + */ + private LedgerInitSettings initLedgerInitSettings(ParticipantNode[] participantNodes, LedgerMetadata ledgerMetadata) { + LedgerInitSettings ledgerInitSettings = new LedgerInitSettings(); + + // 设置参与方 + ledgerInitSettings.setParticipantNodes(participantNodes); + + // 设置共识设置 + ledgerInitSettings.setConsensusSettings(initConsensusSettings(ledgerMetadata)); + + // 设置参与方根Hash + ledgerInitSettings.setParticipantsHash(ledgerMetadata.getParticipantsHash()); + + // 设置算法配置 + ledgerInitSettings.setCryptoSetting(ledgerMetadata.getSetting().getCryptoSetting()); + + // 设置种子 + ledgerInitSettings.setSeed(initSeed(ledgerMetadata.getSeed())); + + // 设置共识协议 + ledgerInitSettings.setConsensusProtocol(consensusProtocol(ledgerMetadata.getSetting().getConsensusProvider())); + + return ledgerInitSettings; + } + + /** + * 初始化账本种子信息 + * + * @param seedBytes + * 种子的字节数组显示 + * @return + * 种子以十六进制方式显示,为方便阅读,每隔八个字符中间以"-"分割 + */ + private String initSeed(byte[] seedBytes) { + String seedString = HexUtils.encode(seedBytes); + // 每隔八个字符中加入一个一个横线 + StringBuffer seed = new StringBuffer(); + + for( int i = 0; i < seedString.length(); i++) { + char c = seedString.charAt(i); + if (i != 0 && i % 8 == 0) { + seed.append("-"); + } + seed.append(c); + } + + return seed.toString(); + } + + /** + * 生成共识协议 + * + * @param consensusProvider + * 共识协议提提供者 + * @return + */ + private int consensusProtocol(String consensusProvider) { + + if (consensusProvider.equals(BftsmartConsensusProvider.NAME)) { + return LedgerInitSettings.CONSENSUS_PROTOCOL.BFTSMART.code(); + } else if (consensusProvider.equals(MsgQueueConsensusProvider.NAME)) { + return LedgerInitSettings.CONSENSUS_PROTOCOL.MSGQUEUE.code(); + } + + return LedgerInitSettings.CONSENSUS_PROTOCOL.UNKNOWN.code(); + } + + /** + * 初始化共识配置 + * + * @param ledgerMetadata + * 账本元数据 + * @return + */ + private ConsensusSettings initConsensusSettings(LedgerMetadata ledgerMetadata) { + String consensusProvider = ledgerMetadata.getSetting().getConsensusProvider(); + ConsensusProvider provider = ConsensusProviders.getProvider(consensusProvider); + byte[] consensusSettingsBytes = ledgerMetadata.getSetting().getConsensusSetting().toBytes(); + return provider.getSettingsFactory().getConsensusSettingsEncoder().decode(consensusSettingsBytes); + } +} diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceImpl.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceImpl.java index 4f3c5a36..24433b70 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceImpl.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceImpl.java @@ -1,37 +1,37 @@ -package com.jd.blockchain.gateway.service; - -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.gateway.PeerService; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.utils.QueryUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; -import java.util.Arrays; - -import static com.jd.blockchain.utils.BaseConstant.QUERY_LIST_MAX; - -/** - * @Author zhaogw - * @Date 2019/2/22 10:39 - */ -@Component -public class GatewayQueryServiceImpl implements GatewayQueryService { - @Autowired - private PeerService peerService; - - @Override - public HashDigest[] getLedgersHash(int fromIndex, int count) { - HashDigest ledgersHash[] = peerService.getQueryService().getLedgerHashs(); - int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex,count,ledgersHash.length); - HashDigest ledgersHashNew[] = Arrays.copyOfRange(ledgersHash,indexAndCount[0],indexAndCount[0]+indexAndCount[1]); - return ledgersHashNew; - } - - @Override - public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash, int fromIndex, int count) { - ParticipantNode participantNode[] = peerService.getQueryService().getConsensusParticipants(ledgerHash); - int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex,count,participantNode.length); - ParticipantNode participantNodesNew[] = Arrays.copyOfRange(participantNode,indexAndCount[0],indexAndCount[0]+indexAndCount[1]); - return participantNodesNew; - } -} +//package com.jd.blockchain.gateway.service; +// +//import com.jd.blockchain.crypto.HashDigest; +//import com.jd.blockchain.gateway.PeerService; +//import com.jd.blockchain.ledger.ParticipantNode; +//import com.jd.blockchain.utils.QueryUtil; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Component; +//import java.util.Arrays; +// +//import static com.jd.blockchain.utils.BaseConstant.QUERY_LIST_MAX; +// +///** +// * @Author zhaogw +// * @Date 2019/2/22 10:39 +// */ +//@Component +//public class GatewayQueryServiceImpl implements GatewayQueryService { +// @Autowired +// private PeerService peerService; +// +// @Override +// public HashDigest[] getLedgersHash(int fromIndex, int count) { +// HashDigest ledgersHash[] = peerService.getQueryService().getLedgerHashs(); +// int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex,count,ledgersHash.length); +// HashDigest ledgersHashNew[] = Arrays.copyOfRange(ledgersHash,indexAndCount[0],indexAndCount[0]+indexAndCount[1]); +// return ledgersHashNew; +// } +// +// @Override +// public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash, int fromIndex, int count) { +// ParticipantNode participantNode[] = peerService.getQueryService().getConsensusParticipants(ledgerHash); +// int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex,count,participantNode.length); +// ParticipantNode participantNodesNew[] = Arrays.copyOfRange(participantNode,indexAndCount[0],indexAndCount[0]+indexAndCount[1]); +// return participantNodesNew; +// } +//} diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java index 68243eb4..381cc50f 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java @@ -8,6 +8,7 @@ import com.jd.blockchain.gateway.service.DataRetrievalService; import com.jd.blockchain.gateway.service.GatewayQueryService; import com.jd.blockchain.ledger.*; import com.jd.blockchain.sdk.BlockchainExtendQueryService; +import com.jd.blockchain.sdk.LedgerInitSettings; import com.jd.blockchain.tools.keygen.KeyGenCommand; import com.jd.blockchain.utils.BaseConstant; import com.jd.blockchain.utils.ConsoleUtils; @@ -58,6 +59,17 @@ public class BlockBrowserController implements BlockchainExtendQueryService { return peerService.getQueryService().getConsensusParticipants(ledgerHash); } + @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/metadata") + @Override + public LedgerMetadata getLedgerMetadata(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { + return peerService.getQueryService().getLedgerMetadata(ledgerHash); + } + + @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/settings") + public LedgerInitSettings getLedgerInitSettings(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { + return gatewayQueryService.getLedgerInitSettings(ledgerHash); + } + @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks") public LedgerBlock[] getBlocks(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { LedgerInfo ledgerInfo = peerService.getQueryService().getLedger(ledgerHash); diff --git a/source/gateway/src/main/resources/gateway.conf b/source/gateway/src/main/resources/gateway.conf index 84f00679..c8ceaf4e 100644 --- a/source/gateway/src/main/resources/gateway.conf +++ b/source/gateway/src/main/resources/gateway.conf @@ -1,28 +1,30 @@ #网关的HTTP服务地址; -http.host=127.0.0.1 +http.host=0.0.0.0 #网关的HTTP服务端口; http.port=8081 #网关的HTTP服务上下文路径,可选; #http.context-path= -#共识节点的服务地址; +#共识节点的服务地址(与该网关节点连接的Peer节点的IP地址); peer.host=127.0.0.1 -#共识节点的服务端口; -peer.port=7080 +#共识节点的服务端口(与该网关节点连接的Peer节点的端口); +peer.port=12000 #共识节点的服务是否启用安全证书; peer.secure=false #共识节点的服务提供解析器 +#BftSmart共识Provider:com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider +#简单消息共识Provider:com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider -#数据检索服务对应URL +#数据检索服务对应URL,格式:http://{ip}:{port},例如:http://127.0.0.1:10001 #若该值不配置或配置不正确,则浏览器模糊查询部分无法正常显示 -data.retrieval.url=http://192.168.1.1:10001 +data.retrieval.url=http://127.0.0.1:10001 #默认公钥的内容(Base58编码数据); -keys.default.pubkey=endPsK36g6bhgn5bj66uyX4uxqnkfGvdjpxWurAA5hbf8vVoVi8H +keys.default.pubkey=3snPdw7i7PapsDoW185c3kfK6p8s6SwiJAdEUzgnfeuUox12nxgzXu #默认私钥的路径;在 pk-path 和 pk 之间必须设置其一; keys.default.privkey-path= #默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一; -keys.default.privkey=177gjwmuvDnccAvrvmJyCN1dgAqqGzfYpe3pZ8dWWNBneM5GgdsS96vgjvBP4fX61jWfohQ +keys.default.privkey=177gjyoEUhdD1NkQSxBVvfSyovMd1ha5H46zsb9kyErLNBuQkLRAf2ea6CNjStjCFJQN8S1 #默认私钥的解码密码; keys.default.privkey-password=DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY \ No newline at end of file diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java index 68f77f29..88ab790a 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java @@ -1,5 +1,7 @@ package com.jd.blockchain.ledger.core; +import com.jd.blockchain.ledger.LedgerMetadata; +import com.jd.blockchain.ledger.LedgerSetting; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdministration.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdministration.java index 79632ae4..cc09138f 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdministration.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdministration.java @@ -1,5 +1,6 @@ package com.jd.blockchain.ledger.core; +import com.jd.blockchain.ledger.LedgerMetadata; import com.jd.blockchain.ledger.ParticipantNode; public interface LedgerAdministration { diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java index ef34122b..5605003c 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerConfiguration.java @@ -1,6 +1,7 @@ package com.jd.blockchain.ledger.core; import com.jd.blockchain.ledger.CryptoSetting; +import com.jd.blockchain.ledger.LedgerSetting; import com.jd.blockchain.utils.Bytes; public class LedgerConfiguration implements LedgerSetting { diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerMetadata.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerMetadata.java index 4e8f05e5..68d51ae2 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerMetadata.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerMetadata.java @@ -1,36 +1,36 @@ -package com.jd.blockchain.ledger.core; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consts.DataCodes; -import com.jd.blockchain.crypto.HashDigest; - -@DataContract(code = DataCodes.METADATA) -public interface LedgerMetadata { - - /** - * 账本的初始化种子; - * - * @return - */ - @DataField(order = 1, primitiveType = PrimitiveType.BYTES) - byte[] getSeed(); - - /** - * 共识参与方的默克尔树的根; - * - * @return - */ - @DataField(order = 2, primitiveType = PrimitiveType.BYTES) - HashDigest getParticipantsHash(); - - /** - * 账本配置; - * - * @return - */ - @DataField(order = 3, refContract = true) - LedgerSetting getSetting(); - -} +//package com.jd.blockchain.ledger.core; +// +//import com.jd.blockchain.binaryproto.DataContract; +//import com.jd.blockchain.binaryproto.DataField; +//import com.jd.blockchain.binaryproto.PrimitiveType; +//import com.jd.blockchain.consts.DataCodes; +//import com.jd.blockchain.crypto.HashDigest; +// +//@DataContract(code = DataCodes.METADATA) +//public interface LedgerMetadata { +// +// /** +// * 账本的初始化种子; +// * +// * @return +// */ +// @DataField(order = 1, primitiveType = PrimitiveType.BYTES) +// byte[] getSeed(); +// +// /** +// * 共识参与方的默克尔树的根; +// * +// * @return +// */ +// @DataField(order = 2, primitiveType = PrimitiveType.BYTES) +// HashDigest getParticipantsHash(); +// +// /** +// * 账本配置; +// * +// * @return +// */ +// @DataField(order = 3, refContract = true) +// LedgerSetting getSetting(); +// +//} diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerSetting.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerSetting.java index 21ce0565..6e9ad134 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerSetting.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerSetting.java @@ -1,24 +1,24 @@ -package com.jd.blockchain.ledger.core; - -import com.jd.blockchain.binaryproto.DataContract; -import com.jd.blockchain.binaryproto.DataField; -import com.jd.blockchain.binaryproto.PrimitiveType; -import com.jd.blockchain.consts.DataCodes; -import com.jd.blockchain.ledger.CryptoSetting; -import com.jd.blockchain.utils.Bytes; - -@DataContract(code = DataCodes.METADATA_LEDGER_SETTING) -public interface LedgerSetting { - - @DataField(order=0, primitiveType=PrimitiveType.TEXT) - String getConsensusProvider(); - - @DataField(order=1, primitiveType=PrimitiveType.BYTES) - Bytes getConsensusSetting(); - - @DataField(order=2, refContract=true) - CryptoSetting getCryptoSetting(); - -// PrivilegeModelSetting getPrivilegesModelSetting(); - -} \ No newline at end of file +//package com.jd.blockchain.ledger.core; +// +//import com.jd.blockchain.binaryproto.DataContract; +//import com.jd.blockchain.binaryproto.DataField; +//import com.jd.blockchain.binaryproto.PrimitiveType; +//import com.jd.blockchain.consts.DataCodes; +//import com.jd.blockchain.ledger.CryptoSetting; +//import com.jd.blockchain.utils.Bytes; +// +//@DataContract(code = DataCodes.METADATA_LEDGER_SETTING) +//public interface LedgerSetting { +// +// @DataField(order=0, primitiveType=PrimitiveType.TEXT) +// String getConsensusProvider(); +// +// @DataField(order=1, primitiveType=PrimitiveType.BYTES) +// Bytes getConsensusSetting(); +// +// @DataField(order=2, refContract=true) +// CryptoSetting getCryptoSetting(); +// +//// PrivilegeModelSetting getPrivilegesModelSetting(); +// +//} \ No newline at end of file diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java index e7131c5a..086b18ff 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java @@ -3,16 +3,7 @@ package com.jd.blockchain.ledger.core.impl; import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.AccountHeader; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.KVDataEntry; -import com.jd.blockchain.ledger.KVDataObject; -import com.jd.blockchain.ledger.LedgerBlock; -import com.jd.blockchain.ledger.LedgerInfo; -import com.jd.blockchain.ledger.LedgerTransaction; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.ledger.TransactionState; -import com.jd.blockchain.ledger.UserInfo; +import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.ContractAccountSet; import com.jd.blockchain.ledger.core.DataAccount; import com.jd.blockchain.ledger.core.DataAccountSet; @@ -50,10 +41,12 @@ public class LedgerQueryService implements BlockchainQueryService { @Override public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) { - LedgerRepository ledger = ledgerService.getLedger(ledgerHash); - LedgerBlock block = ledger.getLatestBlock(); - LedgerAdministration administration = ledger.getAdminAccount(block); - return administration.getParticipants(); + return ledgerAdministration(ledgerHash).getParticipants(); + } + + @Override + public LedgerMetadata getLedgerMetadata(HashDigest ledgerHash) { + return ledgerAdministration(ledgerHash).getMetadata(); } @Override @@ -338,4 +331,11 @@ public class LedgerQueryService implements BlockchainQueryService { int pages[] = QueryUtil.calFromIndexAndCount(fromIndex,count,(int)contractAccountSet.getTotalCount()); return contractAccountSet.getAccounts(pages[0],pages[1]); } + + private LedgerAdministration ledgerAdministration(HashDigest ledgerHash) { + LedgerRepository ledger = ledgerService.getLedger(ledgerHash); + LedgerBlock block = ledger.getLatestBlock(); + LedgerAdministration administration = ledger.getAdminAccount(block); + return administration; + } } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerRepositoryImpl.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerRepositoryImpl.java index 865f18d0..3182c736 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerRepositoryImpl.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerRepositoryImpl.java @@ -4,12 +4,7 @@ import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.crypto.Crypto; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashFunction; -import com.jd.blockchain.ledger.BlockBody; -import com.jd.blockchain.ledger.CryptoSetting; -import com.jd.blockchain.ledger.LedgerBlock; -import com.jd.blockchain.ledger.LedgerDataSnapshot; -import com.jd.blockchain.ledger.LedgerInitSetting; -import com.jd.blockchain.ledger.TransactionRequest; +import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.AccountAccessPolicy; import com.jd.blockchain.ledger.core.ContractAccountSet; import com.jd.blockchain.ledger.core.DataAccountSet; @@ -20,7 +15,6 @@ import com.jd.blockchain.ledger.core.LedgerDataSet; import com.jd.blockchain.ledger.core.LedgerEditor; import com.jd.blockchain.ledger.core.LedgerException; import com.jd.blockchain.ledger.core.LedgerRepository; -import com.jd.blockchain.ledger.core.LedgerSetting; import com.jd.blockchain.ledger.core.LedgerTransactionContext; import com.jd.blockchain.ledger.core.TransactionSet; import com.jd.blockchain.ledger.core.UserAccountSet; @@ -486,7 +480,7 @@ public class LedgerRepositoryImpl implements LedgerRepository { } static TransactionSet newTransactionSet(LedgerSetting ledgerSetting, String keyPrefix, - ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { + ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { // TransactionSet transactionSet = new // TransactionSet(ledgerSetting.getCryptoSetting(), // PrefixAppender.prefix(TRANSACTION_SET_PREFIX, ledgerExStorage), diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java index 4277434d..5bb29512 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerTransactionalEditor.java @@ -5,17 +5,9 @@ import java.util.Stack; import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.crypto.Crypto; import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.BlockBody; -import com.jd.blockchain.ledger.CryptoSetting; -import com.jd.blockchain.ledger.LedgerBlock; -import com.jd.blockchain.ledger.LedgerDataSnapshot; -import com.jd.blockchain.ledger.LedgerInitSetting; -import com.jd.blockchain.ledger.LedgerTransaction; -import com.jd.blockchain.ledger.TransactionRequest; -import com.jd.blockchain.ledger.TransactionState; +import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.LedgerDataSet; import com.jd.blockchain.ledger.core.LedgerEditor; -import com.jd.blockchain.ledger.core.LedgerSetting; import com.jd.blockchain.ledger.core.LedgerTransactionContext; import com.jd.blockchain.ledger.core.TransactionSet; import com.jd.blockchain.storage.service.ExPolicyKVStorage; @@ -67,7 +59,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { } public static LedgerTransactionalEditor createEditor(LedgerSetting ledgerSetting, LedgerBlock previousBlock, - String ledgerKeyPrefix, ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { + String ledgerKeyPrefix, ExPolicyKVStorage ledgerExStorage, VersioningKVStorage ledgerVerStorage) { // new block; LedgerBlockData currBlock = new LedgerBlockData(previousBlock.getHeight() + 1, previousBlock.getLedgerHash(), previousBlock.getHash()); diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java index 75d81904..2d51c185 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java @@ -6,22 +6,7 @@ import java.util.List; import com.alibaba.fastjson.JSON; import com.jd.blockchain.contract.LedgerContext; import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.AccountHeader; -import com.jd.blockchain.ledger.BlockchainIdentity; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.BytesValueEntry; -import com.jd.blockchain.ledger.DataAccountKVSetOperation; -import com.jd.blockchain.ledger.DataAccountRegisterOperation; -import com.jd.blockchain.ledger.BytesValueType; -import com.jd.blockchain.ledger.KVDataEntry; -import com.jd.blockchain.ledger.LedgerBlock; -import com.jd.blockchain.ledger.LedgerInfo; -import com.jd.blockchain.ledger.LedgerTransaction; -import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.ledger.TransactionState; -import com.jd.blockchain.ledger.UserInfo; -import com.jd.blockchain.ledger.UserRegisterOperation; +import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import com.jd.blockchain.transaction.BlockchainQueryService; import com.jd.blockchain.transaction.DataAccountKVSetOperationBuilder; @@ -61,6 +46,11 @@ public class ContractLedgerContext implements LedgerContext { return innerQueryService.getConsensusParticipants(ledgerHash); } + @Override + public LedgerMetadata getLedgerMetadata(HashDigest ledgerHash) { + return innerQueryService.getLedgerMetadata(ledgerHash); + } + @Override public LedgerBlock getBlock(HashDigest ledgerHash, long height) { return innerQueryService.getBlock(ledgerHash, height); diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerAdminAccountTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerAdminAccountTest.java index af06d0b1..823b3397 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerAdminAccountTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerAdminAccountTest.java @@ -9,6 +9,7 @@ import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Random; +import com.jd.blockchain.ledger.LedgerMetadata; import org.junit.Test; import com.jd.blockchain.crypto.AddressEncoding; @@ -20,7 +21,6 @@ import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.LedgerAdminAccount; import com.jd.blockchain.ledger.core.LedgerConfiguration; -import com.jd.blockchain.ledger.core.LedgerMetadata; import com.jd.blockchain.storage.service.utils.MemoryKVStorage; import com.jd.blockchain.transaction.ConsensusParticipantData; import com.jd.blockchain.transaction.LedgerInitSettingData; diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java index 19886d4b..f744780d 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java @@ -7,6 +7,8 @@ import static org.junit.Assert.assertTrue; import java.util.Random; +import com.jd.blockchain.ledger.LedgerMetadata; +import com.jd.blockchain.ledger.LedgerSetting; import org.junit.Before; import org.junit.Test; @@ -21,8 +23,6 @@ import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.LedgerAdminAccount; import com.jd.blockchain.ledger.core.LedgerConfiguration; -import com.jd.blockchain.ledger.core.LedgerMetadata; -import com.jd.blockchain.ledger.core.LedgerSetting; import com.jd.blockchain.ledger.core.ParticipantCertData; import com.jd.blockchain.utils.Bytes; diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata.java new file mode 100644 index 00000000..4d7a57b0 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerMetadata.java @@ -0,0 +1,36 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; +import com.jd.blockchain.crypto.HashDigest; + +@DataContract(code = DataCodes.METADATA) +public interface LedgerMetadata { + + /** + * 账本的初始化种子; + * + * @return + */ + @DataField(order = 1, primitiveType = PrimitiveType.BYTES) + byte[] getSeed(); + + /** + * 共识参与方的默克尔树的根; + * + * @return + */ + @DataField(order = 2, primitiveType = PrimitiveType.BYTES) + HashDigest getParticipantsHash(); + + /** + * 账本配置; + * + * @return + */ + @DataField(order = 3, refContract = true) + LedgerSetting getSetting(); + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSetting.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSetting.java new file mode 100644 index 00000000..1a0441bd --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerSetting.java @@ -0,0 +1,24 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; +import com.jd.blockchain.ledger.CryptoSetting; +import com.jd.blockchain.utils.Bytes; + +@DataContract(code = DataCodes.METADATA_LEDGER_SETTING) +public interface LedgerSetting { + + @DataField(order=0, primitiveType=PrimitiveType.TEXT) + String getConsensusProvider(); + + @DataField(order=1, primitiveType=PrimitiveType.BYTES) + Bytes getConsensusSetting(); + + @DataField(order=2, refContract=true) + CryptoSetting getCryptoSetting(); + +// PrivilegeModelSetting getPrivilegesModelSetting(); + +} \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java index 3b33a720..45301f13 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java @@ -36,6 +36,14 @@ public interface BlockchainQueryService { */ ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash); + /** + * 返回当前账本的元数据 + * + * @param ledgerHash + * @return + */ + LedgerMetadata getLedgerMetadata(HashDigest ledgerHash); + /** * 返回指定账本序号的区块; * diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java b/source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java index e221ba98..6db9674c 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java @@ -1,5 +1,7 @@ package com.jd.blockchain.peer.web; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.ledger.core.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,25 +12,6 @@ import org.springframework.web.bind.annotation.RestController; import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.AccountHeader; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.KVDataEntry; -import com.jd.blockchain.ledger.KVDataObject; -import com.jd.blockchain.ledger.LedgerBlock; -import com.jd.blockchain.ledger.LedgerInfo; -import com.jd.blockchain.ledger.LedgerTransaction; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.ledger.TransactionState; -import com.jd.blockchain.ledger.UserInfo; -import com.jd.blockchain.ledger.core.ContractAccountSet; -import com.jd.blockchain.ledger.core.DataAccount; -import com.jd.blockchain.ledger.core.DataAccountSet; -import com.jd.blockchain.ledger.core.LedgerAdministration; -import com.jd.blockchain.ledger.core.LedgerRepository; -import com.jd.blockchain.ledger.core.LedgerService; -import com.jd.blockchain.ledger.core.ParticipantCertData; -import com.jd.blockchain.ledger.core.TransactionSet; -import com.jd.blockchain.ledger.core.UserAccountSet; import com.jd.blockchain.transaction.BlockchainQueryService; import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.QueryUtil; @@ -79,6 +62,15 @@ public class LedgerQueryController implements BlockchainQueryService { return null; } + @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/metadata") + @Override + public LedgerMetadata getLedgerMetadata(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) { + LedgerRepository ledger = ledgerService.getLedger(ledgerHash); + LedgerAdministration ledgerAdministration = ledger.getAdminInfo(); + LedgerMetadata ledgerMetadata = ledgerAdministration.getMetadata(); + return ledgerMetadata; + } + @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}") @Override public LedgerBlock getBlock(@PathVariable(name = "ledgerHash") HashDigest ledgerHash, diff --git a/source/pom.xml b/source/pom.xml index 3b9b2efa..f8c9dfce 100644 --- a/source/pom.xml +++ b/source/pom.xml @@ -297,6 +297,25 @@ commons-collections4 4.1 + + + + org.reflections + reflections + 0.9.10 + + + com.google.guava + guava + + + + + + com.google.guava + guava + 19.0 + diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/LedgerInitSettings.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/LedgerInitSettings.java new file mode 100644 index 00000000..fa3c2cd0 --- /dev/null +++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/LedgerInitSettings.java @@ -0,0 +1,113 @@ +package com.jd.blockchain.sdk; + + +import com.jd.blockchain.consensus.ConsensusSettings; +import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.ledger.CryptoSetting; +import com.jd.blockchain.ledger.ParticipantNode; + +/** + * 账本初始化配置 + * + * @author shaozhuguang + * @date 2019-04-23 + * @since 1.0.0 + * + */ +public class LedgerInitSettings { + + /** + * 账本初始化种子 + */ + private String seed; + + /** + * 共识参与方的默克尔树的根; + */ + private HashDigest participantsHash; + + /** + * 算法配置 + */ + private CryptoSetting cryptoSetting; + + /** + * 共识协议 + */ + private int consensusProtocol; + + /** + * 共识配置 + */ + private ConsensusSettings consensusSettings; + + /** + * 共识参与方 + */ + private ParticipantNode[] participantNodes; + + public void setSeed(String seed) { + this.seed = seed; + } + + public String getSeed() { + return seed; + } + + public HashDigest getParticipantsHash() { + return participantsHash; + } + + public void setParticipantsHash(HashDigest participantsHash) { + this.participantsHash = participantsHash; + } + + public CryptoSetting getCryptoSetting() { + return cryptoSetting; + } + + public void setCryptoSetting(CryptoSetting cryptoSetting) { + this.cryptoSetting = cryptoSetting; + } + + public int getConsensusProtocol() { + return consensusProtocol; + } + + public void setConsensusProtocol(int consensusProtocol) { + this.consensusProtocol = consensusProtocol; + } + + public ConsensusSettings getConsensusSettings() { + return consensusSettings; + } + + public void setConsensusSettings(ConsensusSettings consensusSettings) { + this.consensusSettings = consensusSettings; + } + + public ParticipantNode[] getParticipantNodes() { + return participantNodes; + } + + public void setParticipantNodes(ParticipantNode[] participantNodes) { + this.participantNodes = participantNodes; + } + + public enum CONSENSUS_PROTOCOL { + UNKNOWN(0), + BFTSMART(1), + MSGQUEUE(2), + ; + + private int code; + + CONSENSUS_PROTOCOL(int code) { + this.code = code; + } + + public int code() { + return code; + } + } +} diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java index da602b9b..4dbe7bc9 100644 --- a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java +++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java @@ -37,7 +37,12 @@ public abstract class BlockchainServiceProxy implements BlockchainService { return getQueryService(ledgerHash).getConsensusParticipants(ledgerHash); } - @Override + @Override + public LedgerMetadata getLedgerMetadata(HashDigest ledgerHash) { + return getQueryService(ledgerHash).getLedgerMetadata(ledgerHash); + } + + @Override public LedgerBlock getBlock(HashDigest ledgerHash, long height) { return getQueryService(ledgerHash).getBlock(ledgerHash, height); } diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java index 19df6c9a..bfdc0baf 100644 --- a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java +++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java @@ -204,6 +204,17 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService @Override ParticipantNode[] getConsensusParticipants(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash); + + /** + * 返回指定账本的元数据 + * + * @param ledgerHash + * @return + */ + @HttpAction(method=HttpMethod.GET, path="ledgers/{ledgerHash}/metadata") + @Override + LedgerMetadata getLedgerMetadata(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash); + /** * 返回指定账本序号的区块; * diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/service/NodeSigningAppender.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/service/NodeSigningAppender.java index 52f289a8..17611678 100644 --- a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/service/NodeSigningAppender.java +++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/service/NodeSigningAppender.java @@ -72,7 +72,7 @@ public class NodeSigningAppender implements TransactionService { // 计算交易哈希; byte[] nodeRequestBytes = BinaryProtocol.encode(txMessage, TransactionRequest.class); - HashFunction hashFunc = Crypto.getHashFunction(signAlgorithm); + HashFunction hashFunc = Crypto.getHashFunction(this.hashAlgorithm); HashDigest txHash = hashFunc.hash(nodeRequestBytes); txMessage.setHash(txHash); diff --git a/source/storage/storage-composite/pom.xml b/source/storage/storage-composite/pom.xml index a080704a..ca8012d2 100644 --- a/source/storage/storage-composite/pom.xml +++ b/source/storage/storage-composite/pom.xml @@ -14,7 +14,7 @@ storage-service ${project.version} - + + + org.reflections + reflections + + + + com.google.guava + guava + + + + org.springframework.boot + spring-boot + + + org.springframework.boot + spring-boot-autoconfigure + + + org.springframework.boot + spring-boot-configuration-processor + true + +