diff --git a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithmDefinition.java b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithmDefinition.java index 642a27d0..64b6a3e1 100644 --- a/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithmDefinition.java +++ b/source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithmDefinition.java @@ -23,9 +23,9 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm { @Override public String toString() { - return name + "[" + code + "]"; + return name + "[" + (code & 0xFFFF) + "]"; } - + /** * 声明一项哈希算法; * @@ -100,7 +100,7 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm { short code = (short) (RANDOM_ALGORITHM | (uid & 0x00FF)); return new CryptoAlgorithmDefinition(name, code); } - + /** * 声明一项扩展的密码算法; * diff --git a/source/deployment/deployment-gateway/pom.xml b/source/deployment/deployment-gateway/pom.xml index d54811e9..07110bf7 100644 --- a/source/deployment/deployment-gateway/pom.xml +++ b/source/deployment/deployment-gateway/pom.xml @@ -26,6 +26,17 @@ consensus-mq ${project.version} + + + com.jd.blockchain + crypto-classic + ${project.version} + + + com.jd.blockchain + crypto-sm + ${project.version} + diff --git a/source/gateway/pom.xml b/source/gateway/pom.xml index fa43d8b8..f21abfba 100644 --- a/source/gateway/pom.xml +++ b/source/gateway/pom.xml @@ -15,16 +15,6 @@ consensus-framework ${project.version} - - com.jd.blockchain - consensus-mq - ${project.version} - - - com.jd.blockchain - consensus-bftsmart - ${project.version} - com.jd.blockchain ledger-rpc @@ -53,6 +43,13 @@ ${project.version} + + com.jd.blockchain + crypto-classic + ${project.version} + test + + commons-io commons-io @@ -84,8 +81,11 @@ spring-boot-configuration-processor true - + + org.springframework.boot + spring-boot-devtools + true + 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 b296dfc1..6244d018 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 @@ -5,21 +5,20 @@ import com.jd.blockchain.ledger.CryptoSetting; public class CryptoConfig implements CryptoSetting { - private CryptoAlgorithm hashAlgorithm; + private short hashAlgorithm; private boolean autoVerifyHash; - + public CryptoConfig() { } - + public CryptoConfig(CryptoSetting setting) { this.hashAlgorithm = setting.getHashAlgorithm(); this.autoVerifyHash = setting.getAutoVerifyHash(); } - @Override - public CryptoAlgorithm getHashAlgorithm() { + public short getHashAlgorithm() { return hashAlgorithm; } @@ -29,6 +28,10 @@ public class CryptoConfig implements CryptoSetting { } public void setHashAlgorithm(CryptoAlgorithm hashAlgorithm) { + this.hashAlgorithm = hashAlgorithm.code(); + } + + public void setHashAlgorithm(short hashAlgorithm) { this.hashAlgorithm = hashAlgorithm; } @@ -36,5 +39,4 @@ public class CryptoConfig implements CryptoSetting { this.autoVerifyHash = autoVerifyHash; } - } \ No newline at end of file diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleTree.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleTree.java index 9661b510..bbeeba8d 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleTree.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/MerkleTree.java @@ -593,6 +593,7 @@ public class MerkleTree implements Transactional { * 用于记录已更新节点的列表; * @return */ + @SuppressWarnings("unused") private int rehash(PathNode pathNode, List updatedNodes) { // int newDataCount = 0; boolean updated = false; @@ -1248,7 +1249,12 @@ public class MerkleTree implements Transactional { return (int) ((offset - offset % s) / s); } + @SuppressWarnings("unused") private PathNode newEmptyChild(CryptoAlgorithm hashAlgorithm, int index) { + return newEmptyChild(hashAlgorithm.code(), index); + } + + private PathNode newEmptyChild(short hashAlgorithm, int index) { long newStartingSN = startingSN + subinterval * index; PathNode child = new PathNode(hashAlgorithm, newStartingSN, (byte) (level - 1), 0); attachChildNode(child, index); @@ -1437,8 +1443,13 @@ public class MerkleTree implements Transactional { this.dataNodeBytes = dataBytes; } + @SuppressWarnings("unused") private static DataNode newDataNode(CryptoAlgorithm hashAlgorithm, long sn, Bytes key, long version, byte[] hashedData) { + return newDataNode(hashAlgorithm.code(), sn, key, version, hashedData); + } + + private static DataNode newDataNode(short hashAlgorithm, long sn, Bytes key, long version, byte[] hashedData) { // byte[] keyStrBytes = BytesUtils.toBytes(key); // int maskSize = NumberMask.SHORT.getMaskLength(keyStrBytes.length); int keySize = key.size(); diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/MerkleTreeTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/MerkleTreeTest.java index 73a4ee7b..d8cb3d29 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/MerkleTreeTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/MerkleTreeTest.java @@ -34,7 +34,7 @@ public class MerkleTreeTest { Random rand = new Random(); CryptoSetting setting = Mockito.mock(CryptoSetting.class); - when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256); + when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256.code()); when(setting.getAutoVerifyHash()).thenReturn(true); // 测试从空的树开始,顺序增加数据节点; @@ -85,7 +85,7 @@ public class MerkleTreeTest { @Test public void testSequenceInsert_OneCommit() { CryptoSetting setting = Mockito.mock(CryptoSetting.class); - when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256); + when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256.code()); when(setting.getAutoVerifyHash()).thenReturn(true); // 测试从空的树开始,顺序增加数据节点; @@ -139,7 +139,7 @@ public class MerkleTreeTest { @Test public void testSequenceInsert_MultiCommit() { CryptoSetting setting = Mockito.mock(CryptoSetting.class); - when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256); + when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256.code()); when(setting.getAutoVerifyHash()).thenReturn(true); // 测试从空的树开始,顺序增加数据节点; @@ -319,7 +319,7 @@ public class MerkleTreeTest { @Test public void testRandomInsert_MultiCommit() { CryptoSetting setting = Mockito.mock(CryptoSetting.class); - when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256); + when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256.code()); when(setting.getAutoVerifyHash()).thenReturn(true); // 保存所有写入的数据节点的 SN-Hash 映射表; @@ -409,7 +409,7 @@ public class MerkleTreeTest { @Test public void testDataModify() { CryptoSetting setting = Mockito.mock(CryptoSetting.class); - when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256); + when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256.code()); when(setting.getAutoVerifyHash()).thenReturn(true); // 保存所有写入的数据节点的 SN-Hash 映射表; @@ -492,7 +492,7 @@ public class MerkleTreeTest { @Test public void testDataVersionModify() { CryptoSetting setting = Mockito.mock(CryptoSetting.class); - when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256); + when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256.code()); when(setting.getAutoVerifyHash()).thenReturn(true); // 保存所有写入的数据节点的 SN-Hash 映射表; @@ -559,7 +559,7 @@ public class MerkleTreeTest { @Test public void testMerkleReload() { CryptoSetting setting = Mockito.mock(CryptoSetting.class); - when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256); + when(setting.getHashAlgorithm()).thenReturn(ClassicAlgorithm.SHA256.code()); when(setting.getAutoVerifyHash()).thenReturn(true); // 保存所有写入的数据节点的 SN-Hash 映射表; 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 4dae891b..71c25416 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 @@ -3,7 +3,6 @@ package com.jd.blockchain.ledger; import com.jd.blockchain.binaryproto.DataContract; import com.jd.blockchain.binaryproto.DataField; import com.jd.blockchain.consts.TypeCodes; -import com.jd.blockchain.crypto.CryptoAlgorithm; import com.jd.blockchain.utils.ValueType; /** @@ -12,7 +11,7 @@ import com.jd.blockchain.utils.ValueType; * @author huanghaiquan * */ -@DataContract(code= TypeCodes.METADATA_CRYPTO_SETTING) +@DataContract(code = TypeCodes.METADATA_CRYPTO_SETTING) public interface CryptoSetting { /** @@ -24,9 +23,9 @@ public interface CryptoSetting { * * @return */ - @DataField(order=1, refEnum=true) - public CryptoAlgorithm getHashAlgorithm(); - + @DataField(order = 1, primitiveType = ValueType.INT16) + public short getHashAlgorithm(); + /** * 当有完整性证明的数据被从持久化介质中加载时,是否对其进行完整性校验(重新计算 hash 比对是否一致);
* @@ -36,7 +35,7 @@ public interface CryptoSetting { * * @return */ - @DataField(order=2, primitiveType= ValueType.BOOLEAN) + @DataField(order = 2, primitiveType = ValueType.BOOLEAN) public boolean getAutoVerifyHash(); } 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 58d26d4e..78e6b435 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 @@ -4,7 +4,6 @@ import com.jd.blockchain.binaryproto.BinaryEncodingUtils; import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.consensus.MessageService; import com.jd.blockchain.consensus.client.ConsensusClient; -import com.jd.blockchain.crypto.CryptoAlgorithm; import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.CryptoServiceProviders; import com.jd.blockchain.crypto.HashDigest; @@ -39,9 +38,9 @@ public class NodeSigningAppender implements TransactionService { private AsymmetricKeypair nodeKeyPair; - private CryptoAlgorithm hashAlgorithm; + private short hashAlgorithm; - public NodeSigningAppender(CryptoAlgorithm hashAlgorithm, AsymmetricKeypair nodeKeyPair, ConsensusClient consensusClient) { + public NodeSigningAppender(short hashAlgorithm, AsymmetricKeypair nodeKeyPair, ConsensusClient consensusClient) { this.hashAlgorithm = hashAlgorithm; this.nodeKeyPair = nodeKeyPair; this.consensusClient = consensusClient; diff --git a/source/tools/tools-initializer/pom.xml b/source/tools/tools-initializer/pom.xml index f0f28fbb..68b14bbb 100644 --- a/source/tools/tools-initializer/pom.xml +++ b/source/tools/tools-initializer/pom.xml @@ -20,6 +20,16 @@ crypto-framework ${project.version} + + com.jd.blockchain + crypto-classic + ${project.version} + + + com.jd.blockchain + crypto-sm + ${project.version} + com.jd.blockchain ledger-core @@ -47,11 +57,8 @@ ${project.version} - + com.jd.blockchain tools-keygen diff --git a/source/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java b/source/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java index add37c1d..0deb80c7 100644 --- a/source/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java +++ b/source/tools/tools-initializer/src/test/java/test/com/jd/blockchain/tools/initializer/LedgerBindingConfigTest.java @@ -7,13 +7,18 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.util.UUID; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.junit.Test; import org.springframework.core.io.ClassPathResource; +import com.jd.blockchain.crypto.CryptoServiceProviders; import com.jd.blockchain.crypto.HashDigest; +import com.jd.blockchain.crypto.HashFunction; +import com.jd.blockchain.crypto.RandomFunction; +import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.tools.initializer.LedgerBindingConfig; import com.jd.blockchain.tools.initializer.LedgerBindingConfig.BindingConfig; import com.jd.blockchain.utils.codec.Base58Utils; @@ -21,6 +26,15 @@ import com.jd.blockchain.utils.io.BytesUtils; public class LedgerBindingConfigTest { + public static void main(String[] args) { + //生成测试 + HashFunction hashFunc = CryptoServiceProviders.getHashFunction(ClassicAlgorithm.SHA256); + HashDigest hash1 = hashFunc.hash(UUID.randomUUID().toString().getBytes()); + HashDigest hash2 = hashFunc.hash(UUID.randomUUID().toString().getBytes()); + System.out.println("Hash1=[" + hash1.toBase58() + "]"); + System.out.println("Hash1=[" + hash2.toBase58() + "]"); + } + @Test public void testResolveAndStore() throws IOException { ClassPathResource ledgerBindingConfigFile = new ClassPathResource("ledger-binding.conf"); @@ -32,10 +46,10 @@ public class LedgerBindingConfigTest { conf.store(System.out); ByteArrayOutputStream out = new ByteArrayOutputStream(); conf.store(out); - + ByteArrayInputStream newIn = new ByteArrayInputStream(out.toByteArray()); LedgerBindingConfig newConf = LedgerBindingConfig.resolve(newIn); - + assertLedgerBindingConfig(newConf); } finally { in.close(); @@ -49,8 +63,8 @@ public class LedgerBindingConfigTest { * @param conf */ private void assertLedgerBindingConfig(LedgerBindingConfig conf) { - String[] expectedHashs = { "6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K", - "64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty" }; + String[] expectedHashs = { "j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk", + "j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf" }; HashDigest[] hashs = conf.getLedgerHashs(); for (int i = 0; i < hashs.length; i++) { assertEquals(expectedHashs[i], hashs[i].toBase58()); diff --git a/source/tools/tools-initializer/src/test/resources/ledger-binding.conf b/source/tools/tools-initializer/src/test/resources/ledger-binding.conf index f04c2c72..e4cf6c2b 100644 --- a/source/tools/tools-initializer/src/test/resources/ledger-binding.conf +++ b/source/tools/tools-initializer/src/test/resources/ledger-binding.conf @@ -1,34 +1,34 @@ #绑定的账本的hash列表;以逗号分隔; -ledger.bindings=6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K, \ -64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty +ledger.bindings=j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk, \ +j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf -#第1个账本[6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K]的配置; +#第1个账本[j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk]的配置; #账本的当前共识参与方的ID; -binding.6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K.parti.address=1 +binding.j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk.parti.address=1 #账本的当前共识参与方的私钥文件的保存路径; -binding.6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K.parti.pk-path=keys/jd-com.priv +binding.j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk.parti.pk-path=keys/jd-com.priv #账本的当前共识参与方的私钥内容(Base58编码);如果指定了,优先选用此属性,其次是 pk-path 属性; -binding.6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K.parti.pk=AdSXsf5QJpy +binding.j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk.parti.pk=AdSXsf5QJpy #账本的当前共识参与方的私钥文件的读取口令;可为空;如果为空时,节点的启动过程中需要手动从控制台输入; -binding.6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K.parti.pwd= +binding.j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk.parti.pwd= #账本的存储数据库的连接字符串; -binding.6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K.db.uri=redis://ip:port/1 +binding.j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk.db.uri=redis://ip:port/1 #账本的存储数据库的连接口令; -binding.6HaDnSu4kY6vNAdSXsf5QJpyYxrtxxoH1tn8dDRvbRD8K.db.pwd=kksfweffj +binding.j5ptBmn67B2p3yki3ji1j2ZMjnJhrUvP4kFpGmcXgvrhmk.db.pwd=kksfweffj -#第2个账本[64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty]的配置; +#第2个账本[j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf]的配置; #账本的当前共识参与方的ID; -binding.64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty.parti.address=2 +binding.j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf.parti.address=2 #账本的当前共识参与方的私钥文件的保存路径; -binding.64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty.parti.pk-path=keys/jd-com-1.priv +binding.j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf.parti.pk-path=keys/jd-com-1.priv #账本的当前共识参与方的私钥内容(Base58编码);如果指定了,优先选用此属性,其次是 pk-path 属性; -binding.64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty.parti.pk= +binding.j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf.parti.pk= #账本的当前共识参与方的私钥文件的读取口令;可为空;如果为空时,节点的启动过程中需要手动从控制台输入; -binding.64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty.parti.pwd=kksafe +binding.j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf.parti.pwd=kksafe #账本的存储数据库的连接字符串; -binding.64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty.db.uri=redis://ip:port/2 +binding.j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf.db.uri=redis://ip:port/2 #账本的存储数据库的连接口令; -binding.64hnH4a8n48LeEP5HU2bMWmNxUPcaZ1JRCehRwvuNS8Ty.db.pwd= \ No newline at end of file +binding.j5kLUENMvcUooZjKfz2bEYU6zoK9DAqbdDDU8aZEZFR4qf.db.pwd= \ No newline at end of file