diff --git a/source/gateway/src/main/java/com/jd/blockchain/gateway/web/TxProcessingController.java b/source/gateway/src/main/java/com/jd/blockchain/gateway/web/TxProcessingController.java index 3ee571d9..6ef3cacf 100644 --- a/source/gateway/src/main/java/com/jd/blockchain/gateway/web/TxProcessingController.java +++ b/source/gateway/src/main/java/com/jd/blockchain/gateway/web/TxProcessingController.java @@ -1,5 +1,7 @@ package com.jd.blockchain.gateway.web; +import com.jd.blockchain.crypto.*; +import com.jd.blockchain.transaction.SignatureUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -8,9 +10,6 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.jd.blockchain.binaryproto.BinaryProtocol; -import com.jd.blockchain.crypto.Crypto; -import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.crypto.SignatureFunction; import com.jd.blockchain.gateway.PeerService; import com.jd.blockchain.ledger.DigitalSignature; import com.jd.blockchain.ledger.TransactionContent; @@ -53,11 +52,8 @@ public class TxProcessingController implements TransactionService { throw new IllegalStateException("Not implemented!"); } else { // 验证签名; - byte[] content = BinaryProtocol.encode(txRequest.getTransactionContent(), TransactionContent.class); for (DigitalSignature sign : partiSigns) { - SignatureFunction signFunc = Crypto - .getSignatureFunction(sign.getPubKey().getAlgorithm()); - if (!signFunc.verify(sign.getDigest(), sign.getPubKey(), content)) { + if (!SignatureUtils.verifySignature(txRequest.getTransactionContent(), sign.getDigest(), sign.getPubKey())) { throw new BusinessException("The validation of participant signatures fail!"); } } 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 235d08b8..c4b696c0 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 @@ -28,6 +28,7 @@ import com.jd.blockchain.ledger.core.TransactionSet; import com.jd.blockchain.storage.service.ExPolicyKVStorage; import com.jd.blockchain.storage.service.VersioningKVStorage; import com.jd.blockchain.storage.service.utils.BufferedKVStorage; +import com.jd.blockchain.transaction.SignatureUtils; import com.jd.blockchain.transaction.TxBuilder; import com.jd.blockchain.transaction.TxRequestBuilder; import com.jd.blockchain.utils.Bytes; @@ -205,7 +206,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { DigitalSignature[] endpointSignatures = request.getEndpointSignatures(); if (endpointSignatures != null) { for (DigitalSignature signature : endpointSignatures) { - if (!TxRequestBuilder.verifyHashSignature(txContent.getHash(), signature.getDigest(), + if (!SignatureUtils.verifyHashSignature(txContent.getHash(), signature.getDigest(), signature.getPubKey())) { return false; } @@ -214,7 +215,7 @@ public class LedgerTransactionalEditor implements LedgerEditor { DigitalSignature[] nodeSignatures = request.getNodeSignatures(); if (nodeSignatures != null) { for (DigitalSignature signature : nodeSignatures) { - if (!TxRequestBuilder.verifyHashSignature(txContent.getHash(), signature.getDigest(), + if (!SignatureUtils.verifyHashSignature(txContent.getHash(), signature.getDigest(), signature.getPubKey())) { return false; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PreparedTx.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PreparedTx.java index b2d0f107..cb39f6b6 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PreparedTx.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/PreparedTx.java @@ -68,11 +68,7 @@ public class PreparedTx implements PreparedTransaction { @Override public DigitalSignature sign(AsymmetricKeypair keyPair) { - SignatureFunction signatureFunction = Crypto.getSignatureFunction(keyPair.getAlgorithm()); - PrivKey privKey = keyPair.getPrivKey(); - byte[] content = BinaryProtocol.encode(getTransactionContent(), TransactionContent.class); - SignatureDigest signatureDigest = signatureFunction.sign(privKey, content); - DigitalSignature signature = new DigitalSignatureBlob(keyPair.getPubKey(), signatureDigest); + DigitalSignature signature = SignatureUtils.sign(getTransactionContent(), keyPair); addSignature(signature); return signature; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/SignatureUtils.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/SignatureUtils.java new file mode 100644 index 00000000..a0c99733 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/SignatureUtils.java @@ -0,0 +1,28 @@ +package com.jd.blockchain.transaction; + +import com.jd.blockchain.crypto.*; +import com.jd.blockchain.ledger.DigitalSignature; +import com.jd.blockchain.ledger.TransactionContent; + +public class SignatureUtils { + + public static DigitalSignature sign(TransactionContent txContent, AsymmetricKeypair keyPair) { + SignatureDigest signatureDigest = sign(txContent, keyPair.getPrivKey()); + return new DigitalSignatureBlob(keyPair.getPubKey(), signatureDigest); + } + + public static SignatureDigest sign(TransactionContent txContent, PrivKey privKey) { + return Crypto.getSignatureFunction(privKey.getAlgorithm()).sign(privKey, txContent.getHash().toBytes()); + } + + public static boolean verifySignature(TransactionContent txContent, SignatureDigest signDigest, PubKey pubKey) { + if (!TxBuilder.verifyTxContentHash(txContent, txContent.getHash())) { + return false; + } + return verifyHashSignature(txContent.getHash(), signDigest, pubKey); + } + + public static boolean verifyHashSignature(HashDigest hash, SignatureDigest signDigest, PubKey pubKey) { + return Crypto.getSignatureFunction(pubKey.getAlgorithm()).verify(signDigest, pubKey, hash.toBytes()); + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxRequestBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxRequestBuilder.java index 87326bb1..ef4df764 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxRequestBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxRequestBuilder.java @@ -42,14 +42,14 @@ public class TxRequestBuilder implements TransactionRequestBuilder { @Override public DigitalSignature signAsEndpoint(AsymmetricKeypair keyPair) { - DigitalSignature signature = sign(txContent, keyPair); + DigitalSignature signature = SignatureUtils.sign(txContent, keyPair); addEndpointSignature(signature); return signature; } @Override public DigitalSignature signAsNode(AsymmetricKeypair keyPair) { - DigitalSignature signature = sign(txContent, keyPair); + DigitalSignature signature = SignatureUtils.sign(txContent, keyPair); addNodeSignature(signature); return signature; } @@ -64,26 +64,26 @@ public class TxRequestBuilder implements TransactionRequestBuilder { endpointSignatures.add(signature); } - public static DigitalSignature sign(TransactionContent txContent, AsymmetricKeypair keyPair) { - SignatureDigest signatureDigest = sign(txContent, keyPair.getPrivKey()); - DigitalSignature signature = new DigitalSignatureBlob(keyPair.getPubKey(), signatureDigest); - return signature; - } - - public static SignatureDigest sign(TransactionContent txContent, PrivKey privKey) { - return Crypto.getSignatureFunction(privKey.getAlgorithm()).sign(privKey, txContent.getHash().toBytes()); - } - - public static boolean verifySignature(TransactionContent txContent, SignatureDigest signDigest, PubKey pubKey) { - if (!TxBuilder.verifyTxContentHash(txContent, txContent.getHash())) { - return false; - } - return verifyHashSignature(txContent.getHash(), signDigest, pubKey); - } - - public static boolean verifyHashSignature(HashDigest hash, SignatureDigest signDigest, PubKey pubKey) { - return Crypto.getSignatureFunction(pubKey.getAlgorithm()).verify(signDigest, pubKey, hash.toBytes()); - } +// public static DigitalSignature sign(TransactionContent txContent, AsymmetricKeypair keyPair) { +// SignatureDigest signatureDigest = sign(txContent, keyPair.getPrivKey()); +// DigitalSignature signature = new DigitalSignatureBlob(keyPair.getPubKey(), signatureDigest); +// return signature; +// } +// +// public static SignatureDigest sign(TransactionContent txContent, PrivKey privKey) { +// return Crypto.getSignatureFunction(privKey.getAlgorithm()).sign(privKey, txContent.getHash().toBytes()); +// } + +// public static boolean verifySignature(TransactionContent txContent, SignatureDigest signDigest, PubKey pubKey) { +// if (!TxBuilder.verifyTxContentHash(txContent, txContent.getHash())) { +// return false; +// } +// return verifyHashSignature(txContent.getHash(), signDigest, pubKey); +// } +// +// public static boolean verifyHashSignature(HashDigest hash, SignatureDigest signDigest, PubKey pubKey) { +// return Crypto.getSignatureFunction(pubKey.getAlgorithm()).verify(signDigest, pubKey, hash.toBytes()); +// } @Override public TransactionRequest buildRequest() { diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java b/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java index d207d725..be312e44 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/consensus/ConsensusMessageDispatcher.java @@ -47,8 +47,8 @@ public class ConsensusMessageDispatcher implements MessageHandle { public String beginBatch(String realmName) { RealmProcessor realmProcessor = realmProcessorMap.get(realmName); if (realmProcessor == null) { + beginLock.lock(); try { - beginLock.lock(); realmProcessor = realmProcessorMap.get(realmName); if (realmProcessor == null) { realmProcessor = initRealmProcessor(realmName); @@ -174,8 +174,8 @@ public class ConsensusMessageDispatcher implements MessageHandle { } public String newBatchId() { + realmLock.lock(); try { - realmLock.lock(); if (currBatchId == null) { currBatchId = getRealmName() + "-" + getBatchIdIndex().getAndIncrement(); } @@ -227,8 +227,8 @@ public class ConsensusMessageDispatcher implements MessageHandle { } public void commit() { + realmLock.lock(); try { - realmLock.lock(); if (batchResultHandle == null) { throw new IllegalArgumentException("BatchResultHandle is null, complete() is not execute !"); } @@ -242,8 +242,8 @@ public class ConsensusMessageDispatcher implements MessageHandle { } public void rollback(int reasonCode) { + realmLock.lock(); try { - realmLock.lock(); batchResultHandle.cancel(TransactionState.valueOf((byte)reasonCode)); } finally { realmLock.unlock(); 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 17611678..52f576e4 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 @@ -10,10 +10,12 @@ import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashFunction; import com.jd.blockchain.crypto.SignatureDigest; import com.jd.blockchain.crypto.SignatureFunction; +import com.jd.blockchain.ledger.DigitalSignature; import com.jd.blockchain.ledger.NodeRequest; import com.jd.blockchain.ledger.TransactionRequest; import com.jd.blockchain.ledger.TransactionResponse; import com.jd.blockchain.transaction.DigitalSignatureBlob; +import com.jd.blockchain.transaction.SignatureUtils; import com.jd.blockchain.transaction.TransactionService; import com.jd.blockchain.transaction.TxRequestMessage; import com.jd.blockchain.utils.concurrent.AsyncFuture; @@ -62,13 +64,16 @@ public class NodeSigningAppender implements TransactionService { public TransactionResponse process(TransactionRequest txRequest) { TxRequestMessage txMessage = new TxRequestMessage(txRequest); - // 生成网关签名; - byte[] endpointRequestBytes = BinaryProtocol.encode(txMessage, TransactionRequest.class); +// // 生成网关签名; +// byte[] endpointRequestBytes = BinaryProtocol.encode(txMessage, TransactionRequest.class); +// +// short signAlgorithm = nodeKeyPair.getAlgorithm(); +// SignatureFunction signFunc = Crypto.getSignatureFunction(signAlgorithm); +// SignatureDigest signDigest = signFunc.sign(nodeKeyPair.getPrivKey(), endpointRequestBytes); - short signAlgorithm = nodeKeyPair.getAlgorithm(); - SignatureFunction signFunc = Crypto.getSignatureFunction(signAlgorithm); - SignatureDigest signDigest = signFunc.sign(nodeKeyPair.getPrivKey(), endpointRequestBytes); - txMessage.addNodeSignatures(new DigitalSignatureBlob(nodeKeyPair.getPubKey(), signDigest)); + DigitalSignature nodeSign = SignatureUtils.sign(txRequest.getTransactionContent(), nodeKeyPair); + + txMessage.addNodeSignatures(nodeSign); // 计算交易哈希; byte[] nodeRequestBytes = BinaryProtocol.encode(txMessage, TransactionRequest.class); diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeWeb4SingleStepsTest.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeWeb4SingleStepsTest.java index 875dda05..2cf5701d 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeWeb4SingleStepsTest.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeWeb4SingleStepsTest.java @@ -10,6 +10,7 @@ import java.io.InputStream; import java.util.Properties; import java.util.concurrent.CountDownLatch; +import com.jd.blockchain.transaction.SignatureUtils; import org.springframework.boot.SpringApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.io.ClassPathResource; @@ -125,10 +126,10 @@ public class LedgerInitializeWeb4SingleStepsTest { TransactionContent initTxContent2 = node2.getInitTxContent(); TransactionContent initTxContent3 = node3.getInitTxContent(); - assertTrue(TxRequestBuilder.verifySignature(initTxContent0, permission0.getTransactionSignature(), pubKey0)); - assertTrue(TxRequestBuilder.verifySignature(initTxContent1, permission1.getTransactionSignature(), pubKey1)); - assertTrue(TxRequestBuilder.verifySignature(initTxContent2, permission2.getTransactionSignature(), pubKey2)); - assertTrue(TxRequestBuilder.verifySignature(initTxContent3, permission3.getTransactionSignature(), pubKey3)); + assertTrue(SignatureUtils.verifySignature(initTxContent0, permission0.getTransactionSignature(), pubKey0)); + assertTrue(SignatureUtils.verifySignature(initTxContent1, permission1.getTransactionSignature(), pubKey1)); + assertTrue(SignatureUtils.verifySignature(initTxContent2, permission2.getTransactionSignature(), pubKey2)); + assertTrue(SignatureUtils.verifySignature(initTxContent3, permission3.getTransactionSignature(), pubKey3)); assertNotNull(initTxContent0.getHash()); if (!initTxContent0.getHash().equals(initTxContent1.getHash())) { diff --git a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java index 22002841..116a381a 100644 --- a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java +++ b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java @@ -10,6 +10,7 @@ import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; +import com.jd.blockchain.transaction.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -58,10 +59,6 @@ import com.jd.blockchain.tools.initializer.LedgerInitProcess; import com.jd.blockchain.tools.initializer.LedgerInitProperties; import com.jd.blockchain.tools.initializer.LedgerInitProperties.ConsensusParticipantConfig; import com.jd.blockchain.tools.initializer.Prompter; -import com.jd.blockchain.transaction.DigitalSignatureBlob; -import com.jd.blockchain.transaction.LedgerInitSettingData; -import com.jd.blockchain.transaction.TxBuilder; -import com.jd.blockchain.transaction.TxRequestBuilder; import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.concurrent.InvocationResult; import com.jd.blockchain.utils.io.BytesUtils; @@ -385,7 +382,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI this.initTxContent = initTxBuilder.prepareContent(initSetting.getCreatedTime()); // 对初始交易签名,生成当前参与者的账本初始化许可; - SignatureDigest permissionSign = TxRequestBuilder.sign(initTxContent, privKey); + SignatureDigest permissionSign = SignatureUtils.sign(initTxContent, privKey); LedgerInitPermissionData permission = new LedgerInitPermissionData(currentId, permissionSign); this.currentId = currentId; @@ -504,7 +501,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI continue; } - if (!TxRequestBuilder.verifySignature(this.initTxContent, permission.getTransactionSignature(), pubKey)) { + if (!SignatureUtils.verifySignature(this.initTxContent, permission.getTransactionSignature(), pubKey)) { prompter.error("Invalid permission from participant! --[Id=%s][name=%s]", participants[i].getAddress(), participants[i].getName()); allPermitted = false;