diff --git a/source/binary-proto/pom.xml b/source/binary-proto/pom.xml
index 508639db..3200942b 100644
--- a/source/binary-proto/pom.xml
+++ b/source/binary-proto/pom.xml
@@ -15,5 +15,9 @@
utils-common
${project.version}
+
+ junit
+ junit
+
\ No newline at end of file
diff --git a/source/contract/contract-samples/pom.xml b/source/contract/contract-samples/pom.xml
index b54f9e5f..ef3d3407 100644
--- a/source/contract/contract-samples/pom.xml
+++ b/source/contract/contract-samples/pom.xml
@@ -55,6 +55,16 @@
+
+
+ org.apache.maven.plugins
+ maven-deploy-plugin
+ 2.8.2
+
+ true
+
+
+
diff --git a/source/crypto/crypto-impl/pom.xml b/source/crypto/crypto-impl/pom.xml
deleted file mode 100644
index cb07d6c5..00000000
--- a/source/crypto/crypto-impl/pom.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-
- 4.0.0
-
- com.jd.blockchain
- crypto
- 0.9.0-SNAPSHOT
-
- crypto-impl
-
-
-
- com.jd.blockchain
- crypto-framework
- ${project.version}
-
-
-
-
\ No newline at end of file
diff --git a/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/AsymmtricCryptographyImpl.java b/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/AsymmtricCryptographyImpl.java
deleted file mode 100644
index 41b38408..00000000
--- a/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/AsymmtricCryptographyImpl.java
+++ /dev/null
@@ -1,220 +0,0 @@
-//package com.jd.blockchain.crypto.impl;
-//
-//import com.jd.blockchain.crypto.Ciphertext;
-//import com.jd.blockchain.crypto.CryptoAlgorithm;
-//import com.jd.blockchain.crypto.PrivKey;
-//import com.jd.blockchain.crypto.PubKey;
-//import com.jd.blockchain.crypto.asymmetric.*;
-//import com.jd.blockchain.crypto.impl.jni.asymmetric.JNIED25519SignatureFunction;
-//import com.jd.blockchain.crypto.impl.sm.asymmetric.SM2CryptoFunction;
-//import com.jd.blockchain.crypto.service.classic.ED25519SignatureFunction;
-//
-//public class AsymmtricCryptographyImpl implements AsymmetricCryptography {
-//
-// private static final SignatureFunction ED25519_SIGF = new ED25519SignatureFunction();
-//
-// private static final SignatureFunction SM2_SIGF = new SM2CryptoFunction();
-//
-// private static final SignatureFunction JNIED25519_SIGF = new JNIED25519SignatureFunction();
-//
-// private static final AsymmetricEncryptionFunction SM2_ENCF = new SM2CryptoFunction();
-//
-// /**
-// * 封装了非对称密码算法对应的密钥生成算法
-// */
-// @Override
-// public CryptoKeyPair generateKeyPair(CryptoAlgorithm algorithm) {
-//
-// //判断算法是签名算法还是非对称加密算法,并根据算法生成密钥对,否则抛出异常
-// if (algorithm.isSignable() && algorithm.hasAsymmetricKey()){
-// return getSignatureFunction(algorithm).generateKeyPair();
-// }
-// else if (algorithm.isEncryptable() && algorithm.hasAsymmetricKey()){
-// return getAsymmetricEncryptionFunction(algorithm).generateKeyPair();
-// }
-// else throw new IllegalArgumentException("The specified algorithm is not signature or asymmetric encryption algorithm!");
-// }
-//
-// @Override
-// public SignatureFunction getSignatureFunction(CryptoAlgorithm algorithm) {
-// //遍历签名算法,如果满足,则返回实例
-// switch (algorithm) {
-// case ED25519:
-// return ED25519_SIGF;
-// case SM2:
-// return SM2_SIGF;
-// case JNIED25519:
-// return JNIED25519_SIGF;
-// default:
-// break;
-// }
-// throw new IllegalArgumentException("The specified algorithm is not signature algorithm!");
-// }
-//
-// @Override
-// public boolean verify(byte[] digestBytes, byte[] pubKeyBytes, byte[] data) {
-//
-// //得到SignatureDigest类型的签名摘要,并得到算法标识
-// SignatureDigest signatureDigest = resolveSignatureDigest(digestBytes);
-// CryptoAlgorithm algorithm = signatureDigest.getAlgorithm();
-// PubKey pubKey = resolvePubKey(pubKeyBytes);
-//
-// //验证两个输入中算法标识一致,否则抛出异常
-// if (algorithm != signatureDigest.getAlgorithm())
-// throw new IllegalArgumentException("Digest's algorithm and key's are not matching!");
-//
-// //根据算法标识,调用对应算法实例来验证签名摘要
-// return getSignatureFunction(algorithm).verify(signatureDigest,pubKey,data);
-// }
-//
-// @Override
-// public AsymmetricEncryptionFunction getAsymmetricEncryptionFunction(CryptoAlgorithm algorithm) {
-// //遍历非对称加密算法,如果满足,则返回实例
-// switch (algorithm) {
-// case SM2:
-// return SM2_ENCF;
-// default:
-// break;
-// }
-// throw new IllegalArgumentException("The specified algorithm is not asymmetric encryption algorithm!");
-// }
-//
-// @Override
-// public byte[] decrypt(byte[] privKeyBytes, byte[] ciphertextBytes) {
-//
-// //分别得到PrivKey和Ciphertext类型的密钥和密文,以及privKey对应的算法
-// PrivKey privKey = resolvePrivKey(privKeyBytes);
-// Ciphertext ciphertext = resolveCiphertext(ciphertextBytes);
-// CryptoAlgorithm algorithm = privKey.getAlgorithm();
-//
-// //验证两个输入中算法标识一致,否则抛出异常
-// if (algorithm != ciphertext.getAlgorithm())
-// throw new IllegalArgumentException("Ciphertext's algorithm and key's are not matching!");
-//
-// //根据算法标识,调用对应算法实例来计算返回明文
-// return getAsymmetricEncryptionFunction(algorithm).decrypt(privKey,ciphertext);
-// }
-//
-// @Override
-// public Ciphertext resolveCiphertext(byte[] ciphertextBytes) {
-// Ciphertext ciphertext = tryResolveCiphertext(ciphertextBytes);
-// if (ciphertext == null)
-// throw new IllegalArgumentException("This ciphertextBytes cannot be resolved!");
-// else return ciphertext;
-// }
-//
-// @Override
-// public Ciphertext tryResolveCiphertext(byte[] ciphertextBytes) {
-// //遍历非对称加密算法,如果满足,则返回解析结果
-// if (SM2_ENCF.supportCiphertext(ciphertextBytes)){
-// return SM2_ENCF.resolveCiphertext(ciphertextBytes);
-// }
-// //否则返回null
-// return null;
-// }
-//
-// @Override
-// public SignatureDigest resolveSignatureDigest(byte[] digestBytes) {
-// SignatureDigest signatureDigest = tryResolveSignatureDigest(digestBytes);
-// if (signatureDigest == null)
-// throw new IllegalArgumentException("This digestBytes cannot be resolved!");
-// else return signatureDigest;
-// }
-//
-// @Override
-// public SignatureDigest tryResolveSignatureDigest(byte[] digestBytes) {
-// //遍历签名算法,如果满足,则返回解析结果
-// if (ED25519_SIGF.supportDigest(digestBytes)){
-// return ED25519_SIGF.resolveDigest(digestBytes);
-// }
-// if (SM2_SIGF.supportDigest(digestBytes)){
-// return SM2_SIGF.resolveDigest(digestBytes);
-// }
-// if (JNIED25519_SIGF.supportDigest(digestBytes)){
-// return JNIED25519_SIGF.resolveDigest(digestBytes);
-// }
-// //否则返回null
-// return null;
-// }
-//
-// @Override
-// public byte[] retrievePubKeyBytes(byte[] privKeyBytes) {
-// byte[] pubKeyBytes = tryRetrievePubKeyBytes(privKeyBytes);
-// if (pubKeyBytes == null)
-// throw new IllegalArgumentException("The specified algorithm in privKeyBytes is not signature or asymmetric encryption algorithm!");
-// else return pubKeyBytes;
-// }
-//
-// @Override
-// public byte[] tryRetrievePubKeyBytes(byte[] privKeyBytes) {
-// //解析私钥获得算法标识
-// CryptoAlgorithm algorithm = resolvePrivKey(privKeyBytes).getAlgorithm();
-//
-// //判断算法是签名算法还是非对称加密算法,并根据算法生成密钥对,否则抛出异常
-// if (algorithm.isSignable() && algorithm.hasAsymmetricKey()){
-// return getSignatureFunction(algorithm).retrievePubKeyBytes(privKeyBytes);
-// }
-// else if (algorithm.isEncryptable() && algorithm.hasAsymmetricKey()){
-// return getAsymmetricEncryptionFunction(algorithm).retrievePubKeyBytes(privKeyBytes);
-// }
-// //否则返回null
-// return null;
-// }
-//
-// @Override
-// public PubKey resolvePubKey(byte[] pubKeyBytes) {
-// PubKey pubKey = tryResolvePubKey(pubKeyBytes);
-// if (pubKey == null)
-// throw new IllegalArgumentException("This pubKeyBytes cannot be resolved!");
-// else return pubKey;
-//
-// }
-//
-// @Override
-// public PubKey tryResolvePubKey(byte[] pubKeyBytes) {
-// //遍历签名算法,如果满足,则返回解析结果
-// if (ED25519_SIGF.supportPubKey(pubKeyBytes)){
-// return ED25519_SIGF.resolvePubKey(pubKeyBytes);
-// }
-// if (SM2_SIGF.supportPubKey(pubKeyBytes)){
-// return SM2_SIGF.resolvePubKey(pubKeyBytes);
-// }
-// if (JNIED25519_SIGF.supportPubKey(pubKeyBytes)){
-// return JNIED25519_SIGF.resolvePubKey(pubKeyBytes);
-// }
-// //遍历非对称加密算法,如果满足,则返回解析结果
-// if (SM2_ENCF.supportPubKey(pubKeyBytes)){
-// return SM2_ENCF.resolvePubKey(pubKeyBytes);
-// }
-// //否则返回null
-// return null;
-// }
-//
-// @Override
-// public PrivKey resolvePrivKey(byte[] privKeyBytes) {
-// PrivKey privKey = tryResolvePrivKey(privKeyBytes);
-// if (privKey == null)
-// throw new IllegalArgumentException("This privKeyBytes cannot be resolved!");
-// else return privKey;
-// }
-//
-// @Override
-// public PrivKey tryResolvePrivKey(byte[] privKeyBytes) {
-// //遍历签名算法,如果满足,则返回解析结果
-// if (ED25519_SIGF.supportPrivKey(privKeyBytes)){
-// return ED25519_SIGF.resolvePrivKey(privKeyBytes);
-// }
-// if (SM2_SIGF.supportPrivKey(privKeyBytes)){
-// return SM2_SIGF.resolvePrivKey(privKeyBytes);
-// }
-// if (JNIED25519_SIGF.supportPrivKey(privKeyBytes)){
-// return JNIED25519_SIGF.resolvePrivKey(privKeyBytes);
-// }
-// //遍历非对称加密算法,如果满足,则返回解析结果
-// if (SM2_ENCF.supportPrivKey(privKeyBytes)){
-// return SM2_ENCF.resolvePrivKey(privKeyBytes);
-// }
-// //否则返回null
-// return null;
-// }
-//}
diff --git a/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/CryptoFactoryImpl.java b/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/CryptoFactoryImpl.java
deleted file mode 100644
index ffd35e66..00000000
--- a/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/CryptoFactoryImpl.java
+++ /dev/null
@@ -1,30 +0,0 @@
-//package com.jd.blockchain.crypto.impl;
-//
-//import com.jd.blockchain.crypto.CryptoFactory;
-//import com.jd.blockchain.crypto.asymmetric.AsymmetricCryptography;
-//import com.jd.blockchain.crypto.hash.HashCryptography;
-//import com.jd.blockchain.crypto.symmetric.SymmetricCryptography;
-//
-//public class CryptoFactoryImpl implements CryptoFactory {
-//
-// //Field;
-// private static HashCryptography hashCryptography = new HashCryptographyImpl();
-// private static AsymmetricCryptography asymmetricCryptography = new AsymmtricCryptographyImpl();
-// private static SymmetricCryptography symmetricCryptography = new SymmetricCryptographyImpl();
-//
-// @Override
-// public HashCryptography hashCryptography() {
-// return hashCryptography;
-// }
-//
-// @Override
-// public AsymmetricCryptography asymmetricCryptography() {
-// return asymmetricCryptography;
-// }
-//
-// @Override
-// public SymmetricCryptography symmetricCryptography() {
-// return symmetricCryptography;
-// }
-//
-//}
diff --git a/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/HashCryptographyImpl.java b/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/HashCryptographyImpl.java
deleted file mode 100644
index 59a1defc..00000000
--- a/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/HashCryptographyImpl.java
+++ /dev/null
@@ -1,84 +0,0 @@
-//package com.jd.blockchain.crypto.impl;
-//
-//import com.jd.blockchain.crypto.CryptoAlgorithm;
-//import com.jd.blockchain.crypto.hash.HashCryptography;
-//import com.jd.blockchain.crypto.hash.HashDigest;
-//import com.jd.blockchain.crypto.hash.HashFunction;
-//import com.jd.blockchain.crypto.impl.jni.hash.JNIRIPEMD160HashFunction;
-//import com.jd.blockchain.crypto.impl.jni.hash.JNISHA256HashFunction;
-//import com.jd.blockchain.crypto.impl.sm.hash.SM3HashFunction;
-//import com.jd.blockchain.crypto.service.classic.RIPEMD160HashFunction;
-//import com.jd.blockchain.crypto.service.classic.SHA256HashFunction;
-//
-//public class HashCryptographyImpl implements HashCryptography {
-//
-// private static final HashFunction SHA256_FUNC = new SHA256HashFunction();
-// private static final HashFunction RIPEMD160_FUNC = new RIPEMD160HashFunction();
-// private static final HashFunction SM3_FUNC = new SM3HashFunction();
-//
-// private static final HashFunction JNISHA256_FUNC = new JNISHA256HashFunction();
-// private static final HashFunction JNIRIPEMD160_FUNC = new JNIRIPEMD160HashFunction();
-//
-// @Override
-// public HashFunction getFunction(CryptoAlgorithm algorithm) {
-//
-// // 遍历哈希算法,如果满足,则返回实例
-// switch (algorithm) {
-// case SHA256:
-// return SHA256_FUNC;
-// case RIPEMD160:
-// return RIPEMD160_FUNC;
-// case SM3:
-// return SM3_FUNC;
-// case JNISHA256:
-// return JNISHA256_FUNC;
-// case JNIRIPEMD160:
-// return JNIRIPEMD160_FUNC;
-// default:
-// break;
-// }
-// throw new IllegalArgumentException("The specified algorithm is not hash algorithm!");
-// }
-//
-// @Override
-// public boolean verify(byte[] digestBytes, byte[] data) {
-// HashDigest hashDigest = resolveHashDigest(digestBytes);
-// return verify(hashDigest,data);
-// }
-//
-// @Override
-// public boolean verify(HashDigest digest, byte[] data) {
-// CryptoAlgorithm algorithm = digest.getAlgorithm();
-// return getFunction(algorithm).verify(digest, data);
-// }
-//
-// @Override
-// public HashDigest resolveHashDigest(byte[] digestBytes) {
-// HashDigest hashDigest = tryResolveHashDigest(digestBytes);
-// if (hashDigest == null)
-// throw new IllegalArgumentException("This digestBytes cannot be resolved!");
-// else return hashDigest;
-// }
-//
-// @Override
-// public HashDigest tryResolveHashDigest(byte[] digestBytes) {
-// //遍历哈希函数,如果满足,则返回解析结果
-// if (SHA256_FUNC.supportHashDigest(digestBytes)) {
-// return SHA256_FUNC.resolveHashDigest(digestBytes);
-// }
-// if (RIPEMD160_FUNC.supportHashDigest(digestBytes)) {
-// return RIPEMD160_FUNC.resolveHashDigest(digestBytes);
-// }
-// if (SM3_FUNC.supportHashDigest(digestBytes)) {
-// return SM3_FUNC.resolveHashDigest(digestBytes);
-// }
-// if (JNISHA256_FUNC.supportHashDigest(digestBytes)) {
-// return JNISHA256_FUNC.resolveHashDigest(digestBytes);
-// }
-// if (JNIRIPEMD160_FUNC.supportHashDigest(digestBytes)) {
-// return JNIRIPEMD160_FUNC.resolveHashDigest(digestBytes);
-// }
-// //否则返回null
-// return null;
-// }
-//}
\ No newline at end of file
diff --git a/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/SymmetricCryptographyImpl.java b/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/SymmetricCryptographyImpl.java
deleted file mode 100644
index 115855d0..00000000
--- a/source/crypto/crypto-impl/src/main/java/com/jd/blockchain/crypto/impl/SymmetricCryptographyImpl.java
+++ /dev/null
@@ -1,101 +0,0 @@
-//package com.jd.blockchain.crypto.impl;
-//
-//import com.jd.blockchain.crypto.Ciphertext;
-//import com.jd.blockchain.crypto.CryptoAlgorithm;
-//import com.jd.blockchain.crypto.SingleKey;
-//import com.jd.blockchain.crypto.impl.sm.symmetric.SM4SymmetricEncryptionFunction;
-//import com.jd.blockchain.crypto.service.classic.AESSymmetricEncryptionFunction;
-//import com.jd.blockchain.crypto.symmetric.SymmetricCryptography;
-//import com.jd.blockchain.crypto.symmetric.SymmetricEncryptionFunction;
-//
-//public class SymmetricCryptographyImpl implements SymmetricCryptography {
-//
-// private static final SymmetricEncryptionFunction AES_ENCF = new AESSymmetricEncryptionFunction();
-// private static final SymmetricEncryptionFunction SM4_ENCF = new SM4SymmetricEncryptionFunction();
-//
-// /**
-// * 封装了对称密码算法对应的密钥生成算法
-// */
-// @Override
-// public SingleKey generateKey(CryptoAlgorithm algorithm) {
-//
-// //验证算法标识是对称加密算法,并根据算法生成对称密钥,否则抛出异常
-// if (algorithm.isEncryptable() && algorithm.isSymmetric() ){
-// return (SingleKey) getSymmetricEncryptionFunction(algorithm).generateSymmetricKey();
-// }
-// else throw new IllegalArgumentException("The specified algorithm is not symmetric encryption algorithm!");
-// }
-//
-// @Override
-// public SymmetricEncryptionFunction getSymmetricEncryptionFunction(CryptoAlgorithm algorithm) {
-//
-// // 遍历对称加密算法,如果满足,则返回实例
-// switch (algorithm) {
-// case AES:
-// return AES_ENCF;
-// case SM4:
-// return SM4_ENCF;
-// default:
-// break;
-// }
-// throw new IllegalArgumentException("The specified algorithm is not symmetric encryption algorithm!");
-// }
-//
-// @Override
-// public byte[] decrypt(byte[] symmetricKeyBytes, byte[] ciphertextBytes) {
-//
-// //分别得到SymmetricKey和Ciphertext类型的密钥和密文,以及symmetricKey对应的算法
-// SingleKey symmetricKey = resolveSymmetricKey(symmetricKeyBytes);
-// Ciphertext ciphertext = resolveCiphertext(ciphertextBytes);
-// CryptoAlgorithm algorithm = symmetricKey.getAlgorithm();
-//
-// //验证两个输入中算法标识一致,否则抛出异常
-// if (algorithm != ciphertext.getAlgorithm())
-// throw new IllegalArgumentException("Ciphertext's algorithm and key's are not matching!");
-//
-// //根据算法标识,调用对应算法实例来计算返回明文
-// return getSymmetricEncryptionFunction(algorithm).decrypt(symmetricKey,ciphertext);
-// }
-//
-// @Override
-// public Ciphertext resolveCiphertext(byte[] ciphertextBytes) {
-// Ciphertext ciphertext = tryResolveCiphertext(ciphertextBytes);
-// if (ciphertext == null)
-// throw new IllegalArgumentException("This ciphertextBytes cannot be resolved!");
-// else return ciphertext;
-// }
-//
-// @Override
-// public Ciphertext tryResolveCiphertext(byte[] ciphertextBytes) {
-// //遍历对称加密算法,如果满足,则返回解析结果
-// if (AES_ENCF.supportCiphertext(ciphertextBytes)) {
-// return AES_ENCF.resolveCiphertext(ciphertextBytes);
-// }
-// if (SM4_ENCF.supportCiphertext(ciphertextBytes)) {
-// return SM4_ENCF.resolveCiphertext(ciphertextBytes);
-// }
-// //否则返回null
-// return null;
-// }
-//
-// @Override
-// public SingleKey resolveSymmetricKey(byte[] symmetricKeyBytes) {
-// SingleKey symmetricKey = tryResolveSymmetricKey(symmetricKeyBytes);
-// if (symmetricKey == null)
-// throw new IllegalArgumentException("This symmetricKeyBytes cannot be resolved!");
-// else return symmetricKey;
-// }
-//
-// @Override
-// public SingleKey tryResolveSymmetricKey(byte[] symmetricKeyBytes) {
-// //遍历对称加密算法,如果满足,则返回解析结果
-// if(AES_ENCF.supportSymmetricKey(symmetricKeyBytes)) {
-// return AES_ENCF.resolveSymmetricKey(symmetricKeyBytes);
-// }
-// if(SM4_ENCF.supportSymmetricKey(symmetricKeyBytes)) {
-// return SM4_ENCF.resolveSymmetricKey(symmetricKeyBytes);
-// }
-// //否则返回null
-// return null;
-// }
-//}
diff --git a/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MyAsymmetricEncryptionTest.java b/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MyAsymmetricEncryptionTest.java
deleted file mode 100644
index 87ff496f..00000000
--- a/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MyAsymmetricEncryptionTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-//package test.com.jd.blockchain.crypto.performance;
-//
-//import com.jd.blockchain.crypto.Ciphertext;
-//import com.jd.blockchain.crypto.PrivKey;
-//import com.jd.blockchain.crypto.PubKey;
-//import com.jd.blockchain.crypto.asymmetric.CryptoKeyPair;
-//import com.jd.blockchain.crypto.impl.sm.asymmetric.SM2CryptoFunction;
-//import org.bouncycastle.util.encoders.Hex;
-//
-//public class MyAsymmetricEncryptionTest {
-//
-// public static void main(String[] args) {
-//
-// String string1K = "0123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210";
-// String string1M = "";
-// for (int i = 0; i < 1024 ; i++)
-// {
-// string1M = string1M + string1K;
-// }
-//
-// byte[] data1K = Hex.decode(string1K);
-// byte[] data1M = Hex.decode(string1M);
-// int count = 10000;
-//
-// SM2CryptoFunction sm2 = new SM2CryptoFunction();
-// CryptoKeyPair keyPairSM2 = sm2.generateKeyPair();
-// PrivKey privKeySM2 = keyPairSM2.getPrivKey();
-// PubKey pubKeySM2 = keyPairSM2.getPubKey();
-//
-// System.out.println("=================== do SM2 encrypt test ===================");
-// Ciphertext ciphertextSM2 = null;
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// ciphertextSM2 = sm2.encrypt(pubKeySM2,data1K);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("SM2 Encrypting Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// System.out.println("=================== do SM2 decrypt test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// sm2.decrypt(privKeySM2,ciphertextSM2);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("SM2 Decrypting Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-// }
-//}
diff --git a/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MyHashTest.java b/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MyHashTest.java
deleted file mode 100644
index dfa922fc..00000000
--- a/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MyHashTest.java
+++ /dev/null
@@ -1,62 +0,0 @@
-//package test.com.jd.blockchain.crypto.performance;
-//
-//import com.jd.blockchain.crypto.impl.sm.hash.SM3HashFunction;
-//import com.jd.blockchain.crypto.service.classic.RIPEMD160HashFunction;
-//import com.jd.blockchain.crypto.service.classic.SHA256HashFunction;
-//
-//import java.util.Random;
-//
-//public class MyHashTest {
-//
-// public static void main(String[] args) {
-//
-// Random rand = new Random();
-// byte[] data1K = new byte[1024];
-// rand.nextBytes(data1K);
-// int count = 1000000;
-//
-// SHA256HashFunction sha256hf = new SHA256HashFunction();
-//
-// System.out.println("=================== do SHA256 hash test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// sha256hf.hash(data1K);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("SHA256 hashing Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// RIPEMD160HashFunction ripemd160hf = new RIPEMD160HashFunction();
-//
-// System.out.println("=================== do RIPEMD160 hash test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// ripemd160hf.hash(data1K);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("RIPEMD160 hashing Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// SM3HashFunction sm3hf = new SM3HashFunction();
-//
-// System.out.println("=================== do SM3 hash test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// sm3hf.hash(data1K);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("SM3 hashing Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// }
-//}
-//
diff --git a/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MySignatureTest.java b/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MySignatureTest.java
deleted file mode 100644
index 684ecdb6..00000000
--- a/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MySignatureTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-//package test.com.jd.blockchain.crypto.performance;
-//
-//import com.jd.blockchain.crypto.PrivKey;
-//import com.jd.blockchain.crypto.PubKey;
-//import com.jd.blockchain.crypto.asymmetric.CryptoKeyPair;
-//import com.jd.blockchain.crypto.asymmetric.SignatureDigest;
-//import com.jd.blockchain.crypto.impl.sm.asymmetric.SM2CryptoFunction;
-//import com.jd.blockchain.crypto.service.classic.ED25519SignatureFunction;
-//
-//import java.util.Random;
-//
-//public class MySignatureTest {
-//
-// public static void main(String[] args) {
-//
-// Random rand = new Random();
-// byte[] data = new byte[64];
-// rand.nextBytes(data);
-// int count = 10000;
-//
-// ED25519SignatureFunction ed25519sf = new ED25519SignatureFunction();
-// CryptoKeyPair keyPairED25519 = ed25519sf.generateKeyPair();
-// PrivKey privKeyED25519 = keyPairED25519.getPrivKey();
-// PubKey pubKeyED25519 = keyPairED25519.getPubKey();
-//
-// System.out.println("=================== do ED25519 sign test ===================");
-// SignatureDigest signatureDigestED25519 = null;
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// signatureDigestED25519 = ed25519sf.sign(privKeyED25519,data);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("ED25519 Signing Count=%s; Elapsed Times=%s; TPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// System.out.println("=================== do ED25519 verify test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// ed25519sf.verify(signatureDigestED25519,pubKeyED25519,data);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("ED25519 Verifying Count=%s; Elapsed Times=%s; TPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// SM2CryptoFunction sm2 = new SM2CryptoFunction();
-// CryptoKeyPair keyPairSM2 = sm2.generateKeyPair();
-// PrivKey privKeySM2 = keyPairSM2.getPrivKey();
-// PubKey pubKeySM2 = keyPairSM2.getPubKey();
-//
-//
-// System.out.println("=================== do SM2 sign test ===================");
-// SignatureDigest signatureDigestSM2 = null;
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// signatureDigestSM2 = sm2.sign(privKeySM2,data);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("SM2 Signing Count=%s; Elapsed Times=%s; TPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// System.out.println("=================== do SM2 verify test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// sm2.verify(signatureDigestSM2,pubKeySM2,data);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("SM2 Verifying Count=%s; Elapsed Times=%s; TPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// }
-//}
diff --git a/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MySymmetricEncryptionTest.java b/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MySymmetricEncryptionTest.java
deleted file mode 100644
index fbab4b13..00000000
--- a/source/crypto/crypto-impl/src/test/java/test/com/jd/blockchain/crypto/performance/MySymmetricEncryptionTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-//package test.com.jd.blockchain.crypto.performance;
-//
-//import com.jd.blockchain.crypto.Ciphertext;
-//import com.jd.blockchain.crypto.SingleKey;
-//import com.jd.blockchain.crypto.impl.sm.symmetric.SM4SymmetricEncryptionFunction;
-//import com.jd.blockchain.crypto.service.classic.AESSymmetricEncryptionFunction;
-//
-//import org.bouncycastle.util.encoders.Hex;
-//
-//public class MySymmetricEncryptionTest {
-//
-// public static void main(String[] args) {
-//
-// String string1K = "0123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba98765432100123456789abcdeffedcba9876543210";
-//
-//// String string1M = "";
-//// for (int i = 0; i < 1024 ; i++)
-//// {
-//// string1M = string1M + string1K;
-//// }
-//
-// byte[] data1K = Hex.decode(string1K);
-//// byte[] data1M = Hex.decode(string1M);
-//
-// int count = 100000;
-//
-//
-// AESSymmetricEncryptionFunction aes = new AESSymmetricEncryptionFunction();
-// SingleKey keyAES = (SingleKey) aes.generateSymmetricKey();
-// Ciphertext ciphertext1KAES = null;
-// Ciphertext ciphertext1MAES = null;
-//
-// System.out.println("=================== do AES encrypt test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// ciphertext1KAES = aes.encrypt(keyAES,data1K);
-//// ciphertext1MAES = aes.encrypt(keyAES,data1M);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("AES Encrypting Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-//
-//
-// System.out.println("=================== do AES decrypt test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// aes.decrypt(keyAES,ciphertext1KAES);
-//// aes.decrypt(keyAES,ciphertext1MAES);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("AES Decrypting Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// SM4SymmetricEncryptionFunction sm4 = new SM4SymmetricEncryptionFunction();
-// SingleKey keySM4 = (SingleKey) sm4.generateSymmetricKey();
-// Ciphertext ciphertext1KSM4 = null;
-// Ciphertext ciphertext1MSM4 = null;
-//
-// System.out.println("=================== do SM4 encrypt test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// ciphertext1KSM4 = sm4.encrypt(keySM4,data1K);
-//// ciphertext1MSM4 =sm4.encrypt(keySM4,data1M);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("SM4 Encrypting Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-//
-// System.out.println("=================== do SM4 decrypt test ===================");
-// for (int r = 0; r < 5; r++) {
-// System.out.println("------------- round[" + r + "] --------------");
-// long startTS = System.currentTimeMillis();
-// for (int i = 0; i < count; i++) {
-// sm4.decrypt(keySM4,ciphertext1KSM4);
-//// sm4.decrypt(keySM4,ciphertext1MSM4);
-// }
-// long elapsedTS = System.currentTimeMillis() - startTS;
-// System.out.println(String.format("SM4 Decrypting Count=%s; Elapsed Times=%s; KBPS=%.2f", count, elapsedTS,
-// (count * 1000.00D) / elapsedTS));
-// }
-// }
-//}
diff --git a/source/ledger/ledger-core/pom.xml b/source/ledger/ledger-core/pom.xml
index 34497874..ac1e9948 100644
--- a/source/ledger/ledger-core/pom.xml
+++ b/source/ledger/ledger-core/pom.xml
@@ -62,6 +62,11 @@
${project.version}
test
+
+ org.mockito
+ mockito-core
+ test
+
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 13625600..5696ded7 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
@@ -1,398 +1,399 @@
-package com.jd.blockchain.ledger.core.impl;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.jd.blockchain.contract.ContractException;
-import com.jd.blockchain.crypto.HashDigest;
-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;
-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.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;
-
-public class LedgerQueryService implements BlockchainQueryService {
-
- private LedgerService ledgerService;
-
- public LedgerQueryService(LedgerService ledgerService) {
- this.ledgerService = ledgerService;
- }
-
- @Override
- public HashDigest[] getLedgerHashs() {
- return ledgerService.getLedgerHashs();
- }
-
- @Override
- public LedgerInfo getLedger(HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerInfo ledgerInfo = new LedgerInfo();
- ledgerInfo.setHash(ledger.getHash());
- ledgerInfo.setLatestBlockHash(ledger.getLatestBlockHash());
- ledgerInfo.setLatestBlockHeight(ledger.getLatestBlockHeight());
- return ledgerInfo;
- }
-
- @Override
- public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) {
- return ledgerAdministration(ledgerHash).getParticipants();
- }
-
- @Override
- public LedgerMetadata getLedgerMetadata(HashDigest ledgerHash) {
- return ledgerAdministration(ledgerHash).getMetadata();
- }
-
- @Override
- public LedgerBlock getBlock(HashDigest ledgerHash, long height) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- return ledger.getBlock(height);
- }
-
- @Override
- public LedgerBlock getBlock(HashDigest ledgerHash, HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- return ledger.getBlock(blockHash);
- }
-
- @Override
- public long getTransactionCount(HashDigest ledgerHash, long height) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(height);
- TransactionSet txset = ledger.getTransactionSet(block);
- return txset.getTotalCount();
- }
-
- @Override
- public long getTransactionCount(HashDigest ledgerHash, HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHash);
- TransactionSet txset = ledger.getTransactionSet(block);
- return txset.getTotalCount();
- }
-
- @Override
- public long getTransactionTotalCount(HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- TransactionSet txset = ledger.getTransactionSet(block);
- return txset.getTotalCount();
- }
-
- @Override
- public long getDataAccountCount(HashDigest ledgerHash, long height) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(height);
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- return dataAccountSet.getTotalCount();
- }
-
- @Override
- public long getDataAccountCount(HashDigest ledgerHash, HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHash);
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- return dataAccountSet.getTotalCount();
- }
-
- @Override
- public long getDataAccountTotalCount(HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- return dataAccountSet.getTotalCount();
- }
-
- @Override
- public long getUserCount(HashDigest ledgerHash, long height) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(height);
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- return userAccountSet.getTotalCount();
- }
-
- @Override
- public long getUserCount(HashDigest ledgerHash, HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHash);
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- return userAccountSet.getTotalCount();
- }
-
- @Override
- public long getUserTotalCount(HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- return userAccountSet.getTotalCount();
- }
-
- @Override
- public long getContractCount(HashDigest ledgerHash, long height) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(height);
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- return contractAccountSet.getTotalCount();
- }
-
- @Override
- public long getContractCount(HashDigest ledgerHash, HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHash);
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- return contractAccountSet.getTotalCount();
- }
-
- @Override
- public long getContractTotalCount(HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- return contractAccountSet.getTotalCount();
- }
-
- @Override
- public LedgerTransaction[] getTransactions(HashDigest ledgerHash, long height, int fromIndex, int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock ledgerBlock = ledger.getBlock(height);
- TransactionSet transactionSet = ledger.getTransactionSet(ledgerBlock);
- int lastHeightTxTotalNums = 0;
-
- if (height > 0) {
- lastHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height - 1)).getTotalCount();
- }
-
- int currentHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height)).getTotalCount();
- // 取当前高度的增量交易数,在增量交易里进行查找
- int currentHeightTxNums = currentHeightTxTotalNums - lastHeightTxTotalNums;
-//
-// if (fromIndex < 0 || fromIndex >= currentHeightTxNums) {
-// fromIndex = 0;
-// }
-// if (count == -1) {
-// fromIndex = 0;
-// count = currentHeightTxNums;
-// }
-// if (count > currentHeightTxNums) {
-// count = currentHeightTxNums - fromIndex;
-// }
- int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex, count, currentHeightTxNums);
- return transactionSet.getTxs(lastHeightTxTotalNums + indexAndCount[0], indexAndCount[1]);
- }
-
- @Override
- public LedgerTransaction[] getTransactions(HashDigest ledgerHash, HashDigest blockHash, int fromIndex, int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock ledgerBlock = ledger.getBlock(blockHash);
- long height = ledgerBlock.getHeight();
- TransactionSet transactionSet = ledger.getTransactionSet(ledgerBlock);
- int lastHeightTxTotalNums = 0;
-
- if (height > 0) {
- lastHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height - 1)).getTotalCount();
- }
-
- int currentHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height)).getTotalCount();
- // 取当前块hash的增量交易数,在增量交易里进行查找
- int currentHeightTxNums = currentHeightTxTotalNums - lastHeightTxTotalNums;
-
-// if (fromIndex < 0 || fromIndex >= currentHeightTxNums) {
-// fromIndex = 0;
-// }
-// if (count == -1) {
-// fromIndex = 0;
-// count = currentHeightTxNums;
-// }
-// if (count > currentHeightTxNums) {
-// count = currentHeightTxNums - fromIndex;
-// }
- int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex, count, currentHeightTxNums);
- return transactionSet.getTxs(lastHeightTxTotalNums + indexAndCount[0], indexAndCount[1]);
- }
-
- @Override
- public LedgerTransaction getTransactionByContentHash(HashDigest ledgerHash, HashDigest contentHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- TransactionSet txset = ledger.getTransactionSet(block);
- return txset.get(contentHash);
- }
-
- @Override
- public TransactionState getTransactionStateByContentHash(HashDigest ledgerHash, HashDigest contentHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- TransactionSet txset = ledger.getTransactionSet(block);
- return txset.getTxState(contentHash);
- }
-
- @Override
- public UserInfo getUser(HashDigest ledgerHash, String address) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- return userAccountSet.getUser(address);
-
- }
-
- @Override
- public AccountHeader getDataAccount(HashDigest ledgerHash, String address) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- return dataAccountSet.getDataAccount(Bytes.fromBase58(address));
- }
-
- @Override
- public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String... keys) {
- if (keys == null || keys.length == 0) {
- return null;
- }
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
-
- KVDataEntry[] entries = new KVDataEntry[keys.length];
- long ver;
- for (int i = 0; i < entries.length; i++) {
- final String currKey = keys[i];
-
- ver = dataAccount.getDataVersion(Bytes.fromString(currKey));
-
- if (ver < 0) {
- entries[i] = new KVDataObject(currKey, -1, null);
- } else {
- BytesValue value = dataAccount.getBytes(Bytes.fromString(currKey), ver);
- entries[i] = new KVDataObject(currKey, ver, value);
- }
- }
-
- return entries;
- }
-
- public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, KVInfoVO kvInfoVO) {
- // parse kvInfoVO;
- List keyList = new ArrayList<>();
- List versionList = new ArrayList<>();
- if (kvInfoVO != null) {
- for (KVDataVO kvDataVO : kvInfoVO.getData()) {
- for (Long version : kvDataVO.getVersion()) {
- keyList.add(kvDataVO.getKey());
- versionList.add(version);
- }
- }
- }
- String[] keys = keyList.toArray(new String[keyList.size()]);
- Long[] versions = versionList.toArray(new Long[versionList.size()]);
-
- if (keys == null || keys.length == 0) {
- return null;
- }
- if (versions == null || versions.length == 0) {
- return null;
- }
- if (keys.length != versions.length) {
- throw new ContractException("keys.length!=versions.length!");
- }
-
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
-
- KVDataEntry[] entries = new KVDataEntry[keys.length];
- long ver = -1;
- for (int i = 0; i < entries.length; i++) {
-// ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
-// dataAccount.getBytes(Bytes.fromString(keys[i]),1);
- ver = versions[i];
- if (ver < 0) {
- entries[i] = new KVDataObject(keys[i], -1, null);
- } else {
- if (dataAccount.getDataEntriesTotalCount() == 0
- || dataAccount.getBytes(Bytes.fromString(keys[i]), ver) == null) {
- // is the address is not exist; the result is null;
- entries[i] = new KVDataObject(keys[i], -1, null);
- } else {
- BytesValue value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
- entries[i] = new KVDataObject(keys[i], ver, value);
- }
- }
- }
-
- return entries;
- }
-
- @Override
- public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) {
-
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
-
- return dataAccount.getDataEntries(fromIndex, count);
- }
-
- @Override
- public long getDataEntriesTotalCount(HashDigest ledgerHash, String address) {
-
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
-
- return dataAccount.getDataEntriesTotalCount();
- }
-
- @Override
- public ContractInfo getContract(HashDigest ledgerHash, String address) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- return contractAccountSet.getContract(Bytes.fromBase58(address));
- }
-
- @Override
- public AccountHeader[] getUsers(HashDigest ledgerHash, int fromIndex, int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) userAccountSet.getTotalCount());
- return userAccountSet.getAccounts(pages[0], pages[1]);
- }
-
- @Override
- public AccountHeader[] getDataAccounts(HashDigest ledgerHash, int fromIndex, int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) dataAccountSet.getTotalCount());
- return dataAccountSet.getAccounts(pages[0], pages[1]);
- }
-
- @Override
- public AccountHeader[] getContractAccounts(HashDigest ledgerHash, int fromIndex, int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- 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;
- }
-}
+package com.jd.blockchain.ledger.core.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.jd.blockchain.contract.ContractException;
+import com.jd.blockchain.crypto.HashDigest;
+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;
+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.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;
+
+public class LedgerQueryService implements BlockchainQueryService {
+
+ private LedgerService ledgerService;
+
+ public LedgerQueryService(LedgerService ledgerService) {
+ this.ledgerService = ledgerService;
+ }
+
+ @Override
+ public HashDigest[] getLedgerHashs() {
+ return ledgerService.getLedgerHashs();
+ }
+
+ @Override
+ public LedgerInfo getLedger(HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerInfo ledgerInfo = new LedgerInfo();
+ ledgerInfo.setHash(ledger.getHash());
+ ledgerInfo.setLatestBlockHash(ledger.getLatestBlockHash());
+ ledgerInfo.setLatestBlockHeight(ledger.getLatestBlockHeight());
+ return ledgerInfo;
+ }
+
+ @Override
+ public ParticipantNode[] getConsensusParticipants(HashDigest ledgerHash) {
+ return ledgerAdministration(ledgerHash).getParticipants();
+ }
+
+ @Override
+ public LedgerMetadata getLedgerMetadata(HashDigest ledgerHash) {
+ return ledgerAdministration(ledgerHash).getMetadata();
+ }
+
+ @Override
+ public LedgerBlock getBlock(HashDigest ledgerHash, long height) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ return ledger.getBlock(height);
+ }
+
+ @Override
+ public LedgerBlock getBlock(HashDigest ledgerHash, HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ return ledger.getBlock(blockHash);
+ }
+
+ @Override
+ public long getTransactionCount(HashDigest ledgerHash, long height) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(height);
+ TransactionSet txset = ledger.getTransactionSet(block);
+ return txset.getTotalCount();
+ }
+
+ @Override
+ public long getTransactionCount(HashDigest ledgerHash, HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHash);
+ TransactionSet txset = ledger.getTransactionSet(block);
+ return txset.getTotalCount();
+ }
+
+ @Override
+ public long getTransactionTotalCount(HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ TransactionSet txset = ledger.getTransactionSet(block);
+ return txset.getTotalCount();
+ }
+
+ @Override
+ public long getDataAccountCount(HashDigest ledgerHash, long height) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(height);
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ return dataAccountSet.getTotalCount();
+ }
+
+ @Override
+ public long getDataAccountCount(HashDigest ledgerHash, HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHash);
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ return dataAccountSet.getTotalCount();
+ }
+
+ @Override
+ public long getDataAccountTotalCount(HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ return dataAccountSet.getTotalCount();
+ }
+
+ @Override
+ public long getUserCount(HashDigest ledgerHash, long height) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(height);
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ return userAccountSet.getTotalCount();
+ }
+
+ @Override
+ public long getUserCount(HashDigest ledgerHash, HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHash);
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ return userAccountSet.getTotalCount();
+ }
+
+ @Override
+ public long getUserTotalCount(HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ return userAccountSet.getTotalCount();
+ }
+
+ @Override
+ public long getContractCount(HashDigest ledgerHash, long height) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(height);
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ return contractAccountSet.getTotalCount();
+ }
+
+ @Override
+ public long getContractCount(HashDigest ledgerHash, HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHash);
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ return contractAccountSet.getTotalCount();
+ }
+
+ @Override
+ public long getContractTotalCount(HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ return contractAccountSet.getTotalCount();
+ }
+
+ @Override
+ public LedgerTransaction[] getTransactions(HashDigest ledgerHash, long height, int fromIndex, int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock ledgerBlock = ledger.getBlock(height);
+ TransactionSet transactionSet = ledger.getTransactionSet(ledgerBlock);
+ int lastHeightTxTotalNums = 0;
+
+ if (height > 0) {
+ lastHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height - 1)).getTotalCount();
+ }
+
+ int currentHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height)).getTotalCount();
+ // 取当前高度的增量交易数,在增量交易里进行查找
+ int currentHeightTxNums = currentHeightTxTotalNums - lastHeightTxTotalNums;
+//
+// if (fromIndex < 0 || fromIndex >= currentHeightTxNums) {
+// fromIndex = 0;
+// }
+// if (count == -1) {
+// fromIndex = 0;
+// count = currentHeightTxNums;
+// }
+// if (count > currentHeightTxNums) {
+// count = currentHeightTxNums - fromIndex;
+// }
+ int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex, count, currentHeightTxNums);
+ return transactionSet.getTxs(lastHeightTxTotalNums + indexAndCount[0], indexAndCount[1]);
+ }
+
+ @Override
+ public LedgerTransaction[] getTransactions(HashDigest ledgerHash, HashDigest blockHash, int fromIndex, int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock ledgerBlock = ledger.getBlock(blockHash);
+ long height = ledgerBlock.getHeight();
+ TransactionSet transactionSet = ledger.getTransactionSet(ledgerBlock);
+ int lastHeightTxTotalNums = 0;
+
+ if (height > 0) {
+ lastHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height - 1)).getTotalCount();
+ }
+
+ int currentHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height)).getTotalCount();
+ // 取当前块hash的增量交易数,在增量交易里进行查找
+ int currentHeightTxNums = currentHeightTxTotalNums - lastHeightTxTotalNums;
+
+// if (fromIndex < 0 || fromIndex >= currentHeightTxNums) {
+// fromIndex = 0;
+// }
+// if (count == -1) {
+// fromIndex = 0;
+// count = currentHeightTxNums;
+// }
+// if (count > currentHeightTxNums) {
+// count = currentHeightTxNums - fromIndex;
+// }
+ int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex, count, currentHeightTxNums);
+ return transactionSet.getTxs(lastHeightTxTotalNums + indexAndCount[0], indexAndCount[1]);
+ }
+
+ @Override
+ public LedgerTransaction getTransactionByContentHash(HashDigest ledgerHash, HashDigest contentHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ TransactionSet txset = ledger.getTransactionSet(block);
+ return txset.get(contentHash);
+ }
+
+ @Override
+ public TransactionState getTransactionStateByContentHash(HashDigest ledgerHash, HashDigest contentHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ TransactionSet txset = ledger.getTransactionSet(block);
+ return txset.getTxState(contentHash);
+ }
+
+ @Override
+ public UserInfo getUser(HashDigest ledgerHash, String address) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ return userAccountSet.getUser(address);
+
+ }
+
+ @Override
+ public AccountHeader getDataAccount(HashDigest ledgerHash, String address) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ return dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+ }
+
+ @Override
+ public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String... keys) {
+ if (keys == null || keys.length == 0) {
+ return null;
+ }
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ KVDataEntry[] entries = new KVDataEntry[keys.length];
+ long ver;
+ for (int i = 0; i < entries.length; i++) {
+ final String currKey = keys[i];
+
+ ver = dataAccount.getDataVersion(Bytes.fromString(currKey));
+
+ if (ver < 0) {
+ entries[i] = new KVDataObject(currKey, -1, null);
+ } else {
+ BytesValue value = dataAccount.getBytes(Bytes.fromString(currKey), ver);
+ entries[i] = new KVDataObject(currKey, ver, value);
+ }
+ }
+
+ return entries;
+ }
+
+ public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, KVInfoVO kvInfoVO) {
+ // parse kvInfoVO;
+ List keyList = new ArrayList<>();
+ List versionList = new ArrayList<>();
+ if (kvInfoVO != null) {
+ for (KVDataVO kvDataVO : kvInfoVO.getData()) {
+ for (Long version : kvDataVO.getVersion()) {
+ keyList.add(kvDataVO.getKey());
+ versionList.add(version);
+ }
+ }
+ }
+ String[] keys = keyList.toArray(new String[keyList.size()]);
+ Long[] versions = versionList.toArray(new Long[versionList.size()]);
+
+ if (keys == null || keys.length == 0) {
+ return null;
+ }
+ if (versions == null || versions.length == 0) {
+ return null;
+ }
+ if (keys.length != versions.length) {
+ throw new ContractException("keys.length!=versions.length!");
+ }
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ KVDataEntry[] entries = new KVDataEntry[keys.length];
+ long ver = -1;
+ for (int i = 0; i < entries.length; i++) {
+// ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
+// dataAccount.getBytes(Bytes.fromString(keys[i]),1);
+ ver = versions[i];
+ if (ver < 0) {
+ entries[i] = new KVDataObject(keys[i], -1, null);
+ } else {
+ if (dataAccount.getDataEntriesTotalCount() == 0
+ || dataAccount.getBytes(Bytes.fromString(keys[i]), ver) == null) {
+ // is the address is not exist; the result is null;
+ entries[i] = new KVDataObject(keys[i], -1, null);
+ } else {
+ BytesValue value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
+ entries[i] = new KVDataObject(keys[i], ver, value);
+ }
+ }
+ }
+
+ return entries;
+ }
+
+ @Override
+ public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) {
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) dataAccount.getDataEntriesTotalCount());
+ return dataAccount.getDataEntries(pages[0], pages[1]);
+ }
+
+ @Override
+ public long getDataEntriesTotalCount(HashDigest ledgerHash, String address) {
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ return dataAccount.getDataEntriesTotalCount();
+ }
+
+ @Override
+ public ContractInfo getContract(HashDigest ledgerHash, String address) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ return contractAccountSet.getContract(Bytes.fromBase58(address));
+ }
+
+ @Override
+ public AccountHeader[] getUsers(HashDigest ledgerHash, int fromIndex, int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) userAccountSet.getTotalCount());
+ return userAccountSet.getAccounts(pages[0], pages[1]);
+ }
+
+ @Override
+ public AccountHeader[] getDataAccounts(HashDigest ledgerHash, int fromIndex, int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) dataAccountSet.getTotalCount());
+ return dataAccountSet.getAccounts(pages[0], pages[1]);
+ }
+
+ @Override
+ public AccountHeader[] getContractAccounts(HashDigest ledgerHash, int fromIndex, int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ 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/handles/JVMContractEventSendOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/JVMContractEventSendOperationHandle.java
index a5b592ab..da4da430 100644
--- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/JVMContractEventSendOperationHandle.java
+++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/JVMContractEventSendOperationHandle.java
@@ -1,17 +1,11 @@
package com.jd.blockchain.ledger.core.impl.handles;
-import static com.jd.blockchain.utils.BaseConstant.CONTRACT_SERVICE_PROVIDER;
-
import com.jd.blockchain.contract.engine.ContractCode;
import com.jd.blockchain.contract.engine.ContractEngine;
import com.jd.blockchain.contract.engine.ContractServiceProviders;
-import com.jd.blockchain.ledger.Operation;
import com.jd.blockchain.ledger.core.ContractAccount;
-import com.jd.blockchain.ledger.core.LedgerDataSet;
-import com.jd.blockchain.ledger.core.LedgerService;
-import com.jd.blockchain.ledger.core.TransactionRequestContext;
-import com.jd.blockchain.ledger.core.impl.OperationHandleContext;
-import com.jd.blockchain.utils.concurrent.AsyncFuture;
+
+import static com.jd.blockchain.utils.BaseConstant.CONTRACT_SERVICE_PROVIDER;
public class JVMContractEventSendOperationHandle extends AbtractContractEventHandle {
diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java
index eab81350..41d28ab2 100644
--- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java
+++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java
@@ -1,45 +1,10 @@
package test.com.jd.blockchain.ledger;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Matchers.anyLong;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.Random;
-
-import org.junit.Test;
-import org.mockito.Mockito;
-
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.HashDigest;
-import com.jd.blockchain.ledger.BlockchainKeyGenerator;
-import com.jd.blockchain.ledger.BlockchainKeypair;
-import com.jd.blockchain.ledger.BytesValue;
-import com.jd.blockchain.ledger.BytesData;
-import com.jd.blockchain.ledger.EndpointRequest;
-import com.jd.blockchain.ledger.LedgerBlock;
-import com.jd.blockchain.ledger.LedgerInitSetting;
-import com.jd.blockchain.ledger.LedgerTransaction;
-import com.jd.blockchain.ledger.NodeRequest;
-import com.jd.blockchain.ledger.OperationResult;
-import com.jd.blockchain.ledger.TransactionContent;
-import com.jd.blockchain.ledger.TransactionContentBody;
-import com.jd.blockchain.ledger.TransactionRequest;
-import com.jd.blockchain.ledger.TransactionRequestBuilder;
-import com.jd.blockchain.ledger.TransactionResponse;
-import com.jd.blockchain.ledger.TransactionState;
-import com.jd.blockchain.ledger.UserRegisterOperation;
-import com.jd.blockchain.ledger.core.LedgerDataSet;
-import com.jd.blockchain.ledger.core.LedgerEditor;
-import com.jd.blockchain.ledger.core.LedgerRepository;
-import com.jd.blockchain.ledger.core.LedgerTransactionContext;
-import com.jd.blockchain.ledger.core.UserAccount;
+import com.jd.blockchain.ledger.*;
+import com.jd.blockchain.ledger.core.*;
import com.jd.blockchain.ledger.core.impl.DefaultOperationHandleRegisteration;
import com.jd.blockchain.ledger.core.impl.LedgerManager;
import com.jd.blockchain.ledger.core.impl.LedgerTransactionalEditor;
@@ -48,6 +13,15 @@ import com.jd.blockchain.service.TransactionBatchResultHandle;
import com.jd.blockchain.storage.service.utils.MemoryKVStorage;
import com.jd.blockchain.transaction.TxBuilder;
import com.jd.blockchain.utils.Bytes;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.Random;
+
+import static org.junit.Assert.*;
+import static org.mockito.Matchers.anyLong;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.*;
public class ContractInvokingTest {
static {
diff --git a/source/ledger/ledger-rpc/pom.xml b/source/ledger/ledger-rpc/pom.xml
index cd84bde7..04e46715 100644
--- a/source/ledger/ledger-rpc/pom.xml
+++ b/source/ledger/ledger-rpc/pom.xml
@@ -36,16 +36,16 @@
-
-
-
- org.apache.maven.plugins
- maven-deploy-plugin
- 2.8.2
-
- true
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
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 53f5b36e..341136b0 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,505 +1,506 @@
-package com.jd.blockchain.peer.web;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.jd.blockchain.ledger.*;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.jd.blockchain.contract.ContractException;
-import com.jd.blockchain.crypto.HashDigest;
-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;
-
-@RestController
-@RequestMapping(path = "/")
-public class LedgerQueryController implements BlockchainQueryService {
-
- @Autowired
- private LedgerService ledgerService;
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers")
- @Override
- public HashDigest[] getLedgerHashs() {
- return ledgerService.getLedgerHashs();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}")
- @Override
- public LedgerInfo getLedger(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- // TODO: 需要配置返回值的 spring MsgQueueMessageDispatcher
- // ,对返回对象仅仅序列化声明的返回值类型的属性,而不是整个对象本身;
- LedgerInfo ledgerInfo = new LedgerInfo();
- ledgerInfo.setHash(ledgerHash);
- ledgerInfo.setLatestBlockHash(ledger.getLatestBlockHash());
- ledgerInfo.setLatestBlockHeight(ledger.getLatestBlockHeight());
- return ledgerInfo;
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/participants")
- @Override
- public ParticipantNode[] getConsensusParticipants(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerAdministration ledgerAdministration = ledger.getAdminInfo();
- long participantCount = ledgerAdministration.getParticipantCount();
- if (participantCount <= 0) {
- return null;
- }
- ParticipantNode[] participantNodes = ledgerAdministration.getParticipants();
- // 重新封装,处理Proxy的问题
- if (participantNodes != null && participantNodes.length > 0) {
- ParticipantNode[] convertNodes = new ParticipantNode[participantNodes.length];
- for (int i = 0, length = participantNodes.length; i < length; i++) {
- convertNodes[i] = new ParticipantCertData(participantNodes[i]);
- }
- return convertNodes;
- }
- 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,
- @PathVariable(name = "blockHeight") long blockHeight) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- // TODO: 需要配置返回值的 spring MsgQueueMessageDispatcher
- // ,对返回对象仅仅序列化声明的返回值类型的属性,而不是整个对象本身;
- return ledger.getBlock(blockHeight);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}")
- @Override
- public LedgerBlock getBlock(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHash") HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- // TODO: 需要配置返回值的 spring MsgQueueMessageDispatcher
- // ,对返回对象仅仅序列化声明的返回值类型的属性,而不是整个对象本身;
- return ledger.getBlock(blockHash);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/txs/count")
- @Override
- public long getTransactionCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHeight") long blockHeight) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHeight);
- TransactionSet txSet = ledger.getTransactionSet(block);
- return txSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/txs/count")
- @Override
- public long getTransactionCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHash") HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHash);
- TransactionSet txSet = ledger.getTransactionSet(block);
- return txSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/txs/count")
- @Override
- public long getTransactionTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- TransactionSet txSet = ledger.getTransactionSet(block);
- return txSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/accounts/count")
- @Override
- public long getDataAccountCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHeight") long height) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(height);
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- return dataAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/accounts/count")
- @Override
- public long getDataAccountCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHash") HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHash);
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- return dataAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/accounts/count")
- @Override
- public long getDataAccountTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- return dataAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/users/count")
- @Override
- public long getUserCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHeight") long height) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(height);
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- return userAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/users/count")
- @Override
- public long getUserCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHash") HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHash);
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- return userAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/users/count")
- @Override
- public long getUserTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- return userAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/contracts/count")
- @Override
- public long getContractCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHeight") long height) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(height);
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- return contractAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/contracts/count")
- @Override
- public long getContractCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHash") HashDigest blockHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getBlock(blockHash);
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- return contractAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts/count")
- @Override
- public long getContractTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- return contractAccountSet.getTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/txs")
- @Override
- public LedgerTransaction[] getTransactions(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHeight") long blockHeight,
- @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
- @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
-
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock ledgerBlock = ledger.getBlock(blockHeight);
- TransactionSet transactionSet = ledger.getTransactionSet(ledgerBlock);
- int lastHeightTxTotalNums = 0;
-
- if (blockHeight > 0) {
- lastHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(blockHeight - 1)).getTotalCount();
- }
-
- int currentHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(blockHeight)).getTotalCount();
- // 取当前高度的增量交易数,在增量交易里进行查找
- int currentHeightTxNums = currentHeightTxTotalNums - lastHeightTxTotalNums;
-
-// if (fromIndex < 0 || fromIndex >= currentHeightTxNums) {
-// fromIndex = 0;
-// }
-// if (count == -1) {
-// fromIndex = 0;
-// count = currentHeightTxNums;
-// }
-// if (count > currentHeightTxNums) {
-// count = currentHeightTxNums - fromIndex;
-// }
- int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex, count, currentHeightTxNums);
- return transactionSet.getTxs(lastHeightTxTotalNums + indexAndCount[0], indexAndCount[1]);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/txs")
- @Override
- public LedgerTransaction[] getTransactions(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "blockHash") HashDigest blockHash,
- @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
- @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock ledgerBlock = ledger.getBlock(blockHash);
- long height = ledgerBlock.getHeight();
- TransactionSet transactionSet = ledger.getTransactionSet(ledgerBlock);
- int lastHeightTxTotalNums = 0;
-
- if (height > 0) {
- lastHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height - 1)).getTotalCount();
- }
-
- int currentHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height)).getTotalCount();
- // 取当前块hash的增量交易数,在增量交易里进行查找
- int currentHeightTxNums = currentHeightTxTotalNums - lastHeightTxTotalNums;
-
-// if (fromIndex < 0 || fromIndex >= currentHeightTxNums) {
-// fromIndex = 0;
-// }
-// if (count == -1) {
-// fromIndex = 0;
-// count = currentHeightTxNums;
-// }
-// if (count > currentHeightTxNums) {
-// count = currentHeightTxNums - fromIndex;
-// }
- int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex, count, currentHeightTxNums);
- return transactionSet.getTxs(lastHeightTxTotalNums + indexAndCount[0], indexAndCount[1]);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/txs/{contentHash}")
- @Override
- public LedgerTransaction getTransactionByContentHash(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "contentHash") HashDigest contentHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- TransactionSet txset = ledger.getTransactionSet(block);
- return txset.get(contentHash);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/txs/state/{contentHash}")
- @Override
- public TransactionState getTransactionStateByContentHash(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "contentHash") HashDigest contentHash) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- TransactionSet txset = ledger.getTransactionSet(block);
- return txset.getTxState(contentHash);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/users/address/{address}")
- @Override
- public UserInfo getUser(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "address") String address) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- return userAccountSet.getUser(address);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/accounts/address/{address}")
- @Override
- public AccountHeader getDataAccount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "address") String address) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- return dataAccountSet.getDataAccount(Bytes.fromBase58(address));
- }
-
- @RequestMapping(method = { RequestMethod.GET,
- RequestMethod.POST }, path = "ledgers/{ledgerHash}/accounts/{address}/entries")
- @Override
- public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "address") String address, @RequestParam("keys") String... keys) {
- if (keys == null || keys.length == 0) {
- return null;
- }
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
-
- KVDataEntry[] entries = new KVDataEntry[keys.length];
- long ver;
- for (int i = 0; i < entries.length; i++) {
- ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
- if (ver < 0) {
- entries[i] = new KVDataObject(keys[i], -1, null);
- } else {
- BytesValue value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
- entries[i] = new KVDataObject(keys[i], ver, value);
- }
- }
-
- return entries;
- }
-
- @RequestMapping(method = { RequestMethod.GET,
- RequestMethod.POST }, path = "ledgers/{ledgerHash}/accounts/{address}/entries-version")
- @Override
- public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "address") String address, @RequestBody KVInfoVO kvInfoVO) {
- // parse kvInfoVO;
- List keyList = new ArrayList<>();
- List versionList = new ArrayList<>();
- if (kvInfoVO != null) {
- for (KVDataVO kvDataVO : kvInfoVO.getData()) {
- for (Long version : kvDataVO.getVersion()) {
- keyList.add(kvDataVO.getKey());
- versionList.add(version);
- }
- }
- }
- String[] keys = keyList.toArray(new String[keyList.size()]);
- Long[] versions = versionList.toArray(new Long[versionList.size()]);
-
- if (keys == null || keys.length == 0) {
- return null;
- }
- if (versions == null || versions.length == 0) {
- return null;
- }
- if (keys.length != versions.length) {
- throw new ContractException("keys.length!=versions.length!");
- }
-
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
-
- KVDataEntry[] entries = new KVDataEntry[keys.length];
- long ver = -1;
- for (int i = 0; i < entries.length; i++) {
-// ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
- ver = versions[i];
- if (ver < 0) {
- entries[i] = new KVDataObject(keys[i], -1, null);
- } else {
- if (dataAccount.getDataEntriesTotalCount() == 0
- || dataAccount.getBytes(Bytes.fromString(keys[i]), ver) == null) {
- // is the address is not exist; the result is null;
- entries[i] = new KVDataObject(keys[i], -1, null);
- } else {
- BytesValue value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
- entries[i] = new KVDataObject(keys[i], ver, value);
- }
- }
- }
-
- return entries;
- }
-
- @RequestMapping(method = { RequestMethod.GET,
- RequestMethod.POST }, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
- @Override
- public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "address") String address,
- @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
- @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
-
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
-
- return dataAccount.getDataEntries(fromIndex, count);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries/count")
- @Override
- public long getDataEntriesTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "address") String address) {
-
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
-
- return dataAccount.getDataEntriesTotalCount();
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts/address/{address}")
- @Override
- public ContractInfo getContract(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @PathVariable(name = "address") String address) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- return contractAccountSet.getContract(Bytes.fromBase58(address));
- }
-
- /**
- * get more users by fromIndex and count;
- *
- * @param ledgerHash
- * @param fromIndex
- * @param count
- * @return
- */
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/users")
- @Override
- public AccountHeader[] getUsers(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
- @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
- int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) userAccountSet.getTotalCount());
- return userAccountSet.getAccounts(pages[0], pages[1]);
- }
-
- /**
- * get more dataAccounts by fromIndex and count;
- *
- * @param ledgerHash
- * @param fromIndex
- * @param count
- * @return
- */
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/accounts")
- @Override
- public AccountHeader[] getDataAccounts(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
- @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
- int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) dataAccountSet.getTotalCount());
- return dataAccountSet.getAccounts(pages[0], pages[1]);
- }
-
- @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts")
- @Override
- public AccountHeader[] getContractAccounts(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
- @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
- @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
- LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
- LedgerBlock block = ledger.getLatestBlock();
- ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
- int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) contractAccountSet.getTotalCount());
- return contractAccountSet.getAccounts(pages[0], pages[1]);
- }
-
-}
+package com.jd.blockchain.peer.web;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.jd.blockchain.ledger.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.jd.blockchain.contract.ContractException;
+import com.jd.blockchain.crypto.HashDigest;
+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;
+
+@RestController
+@RequestMapping(path = "/")
+public class LedgerQueryController implements BlockchainQueryService {
+
+ @Autowired
+ private LedgerService ledgerService;
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers")
+ @Override
+ public HashDigest[] getLedgerHashs() {
+ return ledgerService.getLedgerHashs();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}")
+ @Override
+ public LedgerInfo getLedger(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ // TODO: 需要配置返回值的 spring MsgQueueMessageDispatcher
+ // ,对返回对象仅仅序列化声明的返回值类型的属性,而不是整个对象本身;
+ LedgerInfo ledgerInfo = new LedgerInfo();
+ ledgerInfo.setHash(ledgerHash);
+ ledgerInfo.setLatestBlockHash(ledger.getLatestBlockHash());
+ ledgerInfo.setLatestBlockHeight(ledger.getLatestBlockHeight());
+ return ledgerInfo;
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/participants")
+ @Override
+ public ParticipantNode[] getConsensusParticipants(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerAdministration ledgerAdministration = ledger.getAdminInfo();
+ long participantCount = ledgerAdministration.getParticipantCount();
+ if (participantCount <= 0) {
+ return null;
+ }
+ ParticipantNode[] participantNodes = ledgerAdministration.getParticipants();
+ // 重新封装,处理Proxy的问题
+ if (participantNodes != null && participantNodes.length > 0) {
+ ParticipantNode[] convertNodes = new ParticipantNode[participantNodes.length];
+ for (int i = 0, length = participantNodes.length; i < length; i++) {
+ convertNodes[i] = new ParticipantCertData(participantNodes[i]);
+ }
+ return convertNodes;
+ }
+ 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,
+ @PathVariable(name = "blockHeight") long blockHeight) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ // TODO: 需要配置返回值的 spring MsgQueueMessageDispatcher
+ // ,对返回对象仅仅序列化声明的返回值类型的属性,而不是整个对象本身;
+ return ledger.getBlock(blockHeight);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}")
+ @Override
+ public LedgerBlock getBlock(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHash") HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ // TODO: 需要配置返回值的 spring MsgQueueMessageDispatcher
+ // ,对返回对象仅仅序列化声明的返回值类型的属性,而不是整个对象本身;
+ return ledger.getBlock(blockHash);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/txs/count")
+ @Override
+ public long getTransactionCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHeight") long blockHeight) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHeight);
+ TransactionSet txSet = ledger.getTransactionSet(block);
+ return txSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/txs/count")
+ @Override
+ public long getTransactionCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHash") HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHash);
+ TransactionSet txSet = ledger.getTransactionSet(block);
+ return txSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/txs/count")
+ @Override
+ public long getTransactionTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ TransactionSet txSet = ledger.getTransactionSet(block);
+ return txSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/accounts/count")
+ @Override
+ public long getDataAccountCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHeight") long height) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(height);
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ return dataAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/accounts/count")
+ @Override
+ public long getDataAccountCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHash") HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHash);
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ return dataAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/accounts/count")
+ @Override
+ public long getDataAccountTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ return dataAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/users/count")
+ @Override
+ public long getUserCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHeight") long height) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(height);
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ return userAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/users/count")
+ @Override
+ public long getUserCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHash") HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHash);
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ return userAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/users/count")
+ @Override
+ public long getUserTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ return userAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/contracts/count")
+ @Override
+ public long getContractCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHeight") long height) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(height);
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ return contractAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/contracts/count")
+ @Override
+ public long getContractCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHash") HashDigest blockHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getBlock(blockHash);
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ return contractAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts/count")
+ @Override
+ public long getContractTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ return contractAccountSet.getTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/height/{blockHeight}/txs")
+ @Override
+ public LedgerTransaction[] getTransactions(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHeight") long blockHeight,
+ @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
+ @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock ledgerBlock = ledger.getBlock(blockHeight);
+ TransactionSet transactionSet = ledger.getTransactionSet(ledgerBlock);
+ int lastHeightTxTotalNums = 0;
+
+ if (blockHeight > 0) {
+ lastHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(blockHeight - 1)).getTotalCount();
+ }
+
+ int currentHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(blockHeight)).getTotalCount();
+ // 取当前高度的增量交易数,在增量交易里进行查找
+ int currentHeightTxNums = currentHeightTxTotalNums - lastHeightTxTotalNums;
+
+// if (fromIndex < 0 || fromIndex >= currentHeightTxNums) {
+// fromIndex = 0;
+// }
+// if (count == -1) {
+// fromIndex = 0;
+// count = currentHeightTxNums;
+// }
+// if (count > currentHeightTxNums) {
+// count = currentHeightTxNums - fromIndex;
+// }
+ int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex, count, currentHeightTxNums);
+ return transactionSet.getTxs(lastHeightTxTotalNums + indexAndCount[0], indexAndCount[1]);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/blocks/hash/{blockHash}/txs")
+ @Override
+ public LedgerTransaction[] getTransactions(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "blockHash") HashDigest blockHash,
+ @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
+ @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock ledgerBlock = ledger.getBlock(blockHash);
+ long height = ledgerBlock.getHeight();
+ TransactionSet transactionSet = ledger.getTransactionSet(ledgerBlock);
+ int lastHeightTxTotalNums = 0;
+
+ if (height > 0) {
+ lastHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height - 1)).getTotalCount();
+ }
+
+ int currentHeightTxTotalNums = (int) ledger.getTransactionSet(ledger.getBlock(height)).getTotalCount();
+ // 取当前块hash的增量交易数,在增量交易里进行查找
+ int currentHeightTxNums = currentHeightTxTotalNums - lastHeightTxTotalNums;
+
+// if (fromIndex < 0 || fromIndex >= currentHeightTxNums) {
+// fromIndex = 0;
+// }
+// if (count == -1) {
+// fromIndex = 0;
+// count = currentHeightTxNums;
+// }
+// if (count > currentHeightTxNums) {
+// count = currentHeightTxNums - fromIndex;
+// }
+ int indexAndCount[] = QueryUtil.calFromIndexAndCount(fromIndex, count, currentHeightTxNums);
+ return transactionSet.getTxs(lastHeightTxTotalNums + indexAndCount[0], indexAndCount[1]);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/txs/{contentHash}")
+ @Override
+ public LedgerTransaction getTransactionByContentHash(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "contentHash") HashDigest contentHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ TransactionSet txset = ledger.getTransactionSet(block);
+ return txset.get(contentHash);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/txs/state/{contentHash}")
+ @Override
+ public TransactionState getTransactionStateByContentHash(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "contentHash") HashDigest contentHash) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ TransactionSet txset = ledger.getTransactionSet(block);
+ return txset.getTxState(contentHash);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/users/address/{address}")
+ @Override
+ public UserInfo getUser(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "address") String address) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ return userAccountSet.getUser(address);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/accounts/address/{address}")
+ @Override
+ public AccountHeader getDataAccount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "address") String address) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ return dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+ }
+
+ @RequestMapping(method = { RequestMethod.GET,
+ RequestMethod.POST }, path = "ledgers/{ledgerHash}/accounts/{address}/entries")
+ @Override
+ public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "address") String address, @RequestParam("keys") String... keys) {
+ if (keys == null || keys.length == 0) {
+ return null;
+ }
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ KVDataEntry[] entries = new KVDataEntry[keys.length];
+ long ver;
+ for (int i = 0; i < entries.length; i++) {
+ ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
+ if (ver < 0) {
+ entries[i] = new KVDataObject(keys[i], -1, null);
+ } else {
+ BytesValue value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
+ entries[i] = new KVDataObject(keys[i], ver, value);
+ }
+ }
+
+ return entries;
+ }
+
+ @RequestMapping(method = { RequestMethod.GET,
+ RequestMethod.POST }, path = "ledgers/{ledgerHash}/accounts/{address}/entries-version")
+ @Override
+ public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "address") String address, @RequestBody KVInfoVO kvInfoVO) {
+ // parse kvInfoVO;
+ List keyList = new ArrayList<>();
+ List versionList = new ArrayList<>();
+ if (kvInfoVO != null) {
+ for (KVDataVO kvDataVO : kvInfoVO.getData()) {
+ for (Long version : kvDataVO.getVersion()) {
+ keyList.add(kvDataVO.getKey());
+ versionList.add(version);
+ }
+ }
+ }
+ String[] keys = keyList.toArray(new String[keyList.size()]);
+ Long[] versions = versionList.toArray(new Long[versionList.size()]);
+
+ if (keys == null || keys.length == 0) {
+ return null;
+ }
+ if (versions == null || versions.length == 0) {
+ return null;
+ }
+ if (keys.length != versions.length) {
+ throw new ContractException("keys.length!=versions.length!");
+ }
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ KVDataEntry[] entries = new KVDataEntry[keys.length];
+ long ver = -1;
+ for (int i = 0; i < entries.length; i++) {
+// ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
+ ver = versions[i];
+ if (ver < 0) {
+ entries[i] = new KVDataObject(keys[i], -1, null);
+ } else {
+ if (dataAccount.getDataEntriesTotalCount() == 0
+ || dataAccount.getBytes(Bytes.fromString(keys[i]), ver) == null) {
+ // is the address is not exist; the result is null;
+ entries[i] = new KVDataObject(keys[i], -1, null);
+ } else {
+ BytesValue value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
+ entries[i] = new KVDataObject(keys[i], ver, value);
+ }
+ }
+ }
+
+ return entries;
+ }
+
+ @RequestMapping(method = { RequestMethod.GET,
+ RequestMethod.POST }, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
+ @Override
+ public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "address") String address,
+ @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
+ @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) dataAccount.getDataEntriesTotalCount());
+ return dataAccount.getDataEntries(pages[0], pages[1]);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries/count")
+ @Override
+ public long getDataEntriesTotalCount(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "address") String address) {
+
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ DataAccount dataAccount = dataAccountSet.getDataAccount(Bytes.fromBase58(address));
+
+ return dataAccount.getDataEntriesTotalCount();
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts/address/{address}")
+ @Override
+ public ContractInfo getContract(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @PathVariable(name = "address") String address) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ return contractAccountSet.getContract(Bytes.fromBase58(address));
+ }
+
+ /**
+ * get more users by fromIndex and count;
+ *
+ * @param ledgerHash
+ * @param fromIndex
+ * @param count
+ * @return
+ */
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/users")
+ @Override
+ public AccountHeader[] getUsers(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
+ @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ UserAccountSet userAccountSet = ledger.getUserAccountSet(block);
+ int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) userAccountSet.getTotalCount());
+ return userAccountSet.getAccounts(pages[0], pages[1]);
+ }
+
+ /**
+ * get more dataAccounts by fromIndex and count;
+ *
+ * @param ledgerHash
+ * @param fromIndex
+ * @param count
+ * @return
+ */
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/accounts")
+ @Override
+ public AccountHeader[] getDataAccounts(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
+ @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ DataAccountSet dataAccountSet = ledger.getDataAccountSet(block);
+ int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) dataAccountSet.getTotalCount());
+ return dataAccountSet.getAccounts(pages[0], pages[1]);
+ }
+
+ @RequestMapping(method = RequestMethod.GET, path = "ledgers/{ledgerHash}/contracts")
+ @Override
+ public AccountHeader[] getContractAccounts(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,
+ @RequestParam(name = "fromIndex", required = false, defaultValue = "0") int fromIndex,
+ @RequestParam(name = "count", required = false, defaultValue = "-1") int count) {
+ LedgerRepository ledger = ledgerService.getLedger(ledgerHash);
+ LedgerBlock block = ledger.getLatestBlock();
+ ContractAccountSet contractAccountSet = ledger.getContractAccountSet(block);
+ int pages[] = QueryUtil.calFromIndexAndCount(fromIndex, count, (int) contractAccountSet.getTotalCount());
+ return contractAccountSet.getAccounts(pages[0], pages[1]);
+ }
+
+}
diff --git a/source/pom.xml b/source/pom.xml
index f2a8ac32..ddd514bf 100644
--- a/source/pom.xml
+++ b/source/pom.xml
@@ -81,19 +81,6 @@
3.4.2
-
-
- junit
- junit
- test
-
-
- org.mockito
- mockito-core
- test
-
-
-
diff --git a/source/sdk/sdk-base/pom.xml b/source/sdk/sdk-base/pom.xml
index 688b689b..1618061c 100644
--- a/source/sdk/sdk-base/pom.xml
+++ b/source/sdk/sdk-base/pom.xml
@@ -1,58 +1,65 @@
-
- 4.0.0
-
- com.jd.blockchain
- sdk
- 1.0.0.RELEASE
-
- sdk-base
-
-
-
-
- com.jd.blockchain
- ledger-model
- ${project.version}
-
-
-
- com.jd.blockchain
- consensus-framework
- ${project.version}
-
-
- binary-proto
- com.jd.blockchain
-
-
- crypto-framework
- com.jd.blockchain
-
-
- utils-common
- com.jd.blockchain
-
-
-
-
-
- com.jd.blockchain
- utils-serialize
- ${project.version}
-
-
- utils-common
- com.jd.blockchain
-
-
-
-
-
-
+
+ 4.0.0
+
+ com.jd.blockchain
+ sdk
+ 1.0.0.RELEASE
+
+ sdk-base
+
+
+
+
+ com.jd.blockchain
+ ledger-model
+ ${project.version}
+
+
+
+ com.jd.blockchain
+ consensus-framework
+ ${project.version}
+
+
+ binary-proto
+ com.jd.blockchain
+
+
+ crypto-framework
+ com.jd.blockchain
+
+
+ utils-common
+ com.jd.blockchain
+
+
+
+
+
+ com.jd.blockchain
+ utils-serialize
+ ${project.version}
+
+
+ utils-common
+ com.jd.blockchain
+
+
+
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+
+
\ No newline at end of file
diff --git a/source/sdk/sdk-base/src/test/java/test/com/jd/blockchain/sdk/proxy/BlockchainServiceProxyTest.java b/source/sdk/sdk-base/src/test/java/test/com/jd/blockchain/sdk/proxy/BlockchainServiceProxyTest.java
index a4a5c45a..6387bd48 100644
--- a/source/sdk/sdk-base/src/test/java/test/com/jd/blockchain/sdk/proxy/BlockchainServiceProxyTest.java
+++ b/source/sdk/sdk-base/src/test/java/test/com/jd/blockchain/sdk/proxy/BlockchainServiceProxyTest.java
@@ -1,95 +1,91 @@
-package test.com.jd.blockchain.sdk.proxy;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.verify;
-
-public class BlockchainServiceProxyTest {
-
-// private static class ArgCaptorMatcher extends CustomMatcher {
-//
-// private T arg;
-//
-// public ArgCaptorMatcher() {
-// super("OK");
-// }
-//
-// @Override
-// public boolean matches(Object item) {
-// this.arg = (T) item;
-// return true;
-// }
-//
-// public T getArg() {
-// return arg;
-// }
-// }
-//
-// @Test
-// public void testRegisterAccount() throws IOException {
-//
-// BlockchainKeyPair gatewayAccount = BlockchainKeyGenerator.getInstance().generate(CryptoKeyType.ED25519);
-// BlockchainKeyPair sponsorAccount = BlockchainKeyGenerator.getInstance().generate(CryptoKeyType.ED25519);
-// BlockchainKeyPair subjectAccount = BlockchainKeyGenerator.getInstance().generate(CryptoKeyType.ED25519);
-// long sequenceNumber = 110;
-//
-// ArgCaptorMatcher txReqCaptor = new ArgCaptorMatcher<>();
-//
-// TransactionService consensusService = Mockito.mocker(TransactionService.class);
-// BlockchainQueryService queryService = Mockito.mocker(BlockchainQueryService.class);
-//
-// HashDigest txContentHash =CryptoUtils.hash(CryptoAlgorithm.SHA_256).hash(UUID.randomUUID().toString().getBytes("UTF-8"));
-// TxResponseMessage expectedResponse = new TxResponseMessage(txContentHash);
-// expectedResponse.setExecutionState(ExecutionState.SUCCESS);
-//
-// when(consensusService.process(argThat(txReqCaptor))).thenReturn(expectedResponse);
-//
-// HashDigest ledgerHash = CryptoUtils.hash(CryptoAlgorithm.SHA_256).hash(UUID.randomUUID().toString().getBytes("UTF-8"));
-//
-// BlockchainTransactionService serviceProxy = new BlockchainServiceProxy(consensusService, queryService);
-//
-// TransactionTemplate txTemplate = serviceProxy.newTransaction(ledgerHash);
-// txTemplate.setSubject(subjectAccount.getAddress(), sequenceNumber);
-//
-// BlockchainKeyPair regAccountKeyPair = BlockchainKeyGenerator.getInstance().generate(CryptoKeyType.ED25519);
-// AccountStateType stateType = AccountStateType.MAP;
-// txTemplate.users().register(regAccountKeyPair.getIdentity(), stateType);
-//
-// PreparedTransaction prepTx = txTemplate.prepare();
-// HashDigest txHash = prepTx.getHash();
-// prepTx.sign(sponsorAccount);
-//
-// TransactionResponse result = prepTx.commit();
-//
-// // 验证;
-// // 仅被提交一次;
-// verify(consensusService, times(1)).process(any());
-//
-// assertEquals(ExecutionState.SUCCESS, result.getExecutionState());
-//
-// // 验证内容;
-// TransactionRequest resolvedTxRequest = txReqCaptor.getArg();
-//
-// TransactionContent resolvedTxContent = resolvedTxRequest.getTransactionContent();
-//
-// assertEquals(txHash, resolvedTxContent.getHash());
-//
-// assertEquals(subjectAccount.getAddress(), resolvedTxContent.getSubjectAccount());
-// assertEquals(sequenceNumber, resolvedTxContent.getSequenceNumber());
-//
-//
-// Operation[] resolvedOps = resolvedTxContent.getOperations();
-// assertEquals(1, resolvedOps.length);
-// Operation resolvedOP = resolvedOps[0];
-//// assertEquals(OperationType.REGISTER_USER.CODE, resolvedOP.getCode());
-//
-// UserRegisterOpTemplate accRegOP = new UserRegisterOpTemplate();
-// accRegOP.resolvFrom((OpBlob) resolvedOP);
-//
-// assertEquals(regAccountKeyPair.getAddress(), accRegOP.getId().getAddress());
-// assertEquals(regAccountKeyPair.getPubKey().getType(), accRegOP.getId().getPubKey().getType());
-// assertEquals(regAccountKeyPair.getPubKey().getValue(), accRegOP.getId().getPubKey().getValue());
-// assertEquals(stateType, accRegOP.getStateType());
-// }
-
-}
+package test.com.jd.blockchain.sdk.proxy;
+
+public class BlockchainServiceProxyTest {
+
+// private static class ArgCaptorMatcher extends CustomMatcher {
+//
+// private T arg;
+//
+// public ArgCaptorMatcher() {
+// super("OK");
+// }
+//
+// @Override
+// public boolean matches(Object item) {
+// this.arg = (T) item;
+// return true;
+// }
+//
+// public T getArg() {
+// return arg;
+// }
+// }
+//
+// @Test
+// public void testRegisterAccount() throws IOException {
+//
+// BlockchainKeyPair gatewayAccount = BlockchainKeyGenerator.getInstance().generate(CryptoKeyType.ED25519);
+// BlockchainKeyPair sponsorAccount = BlockchainKeyGenerator.getInstance().generate(CryptoKeyType.ED25519);
+// BlockchainKeyPair subjectAccount = BlockchainKeyGenerator.getInstance().generate(CryptoKeyType.ED25519);
+// long sequenceNumber = 110;
+//
+// ArgCaptorMatcher txReqCaptor = new ArgCaptorMatcher<>();
+//
+// TransactionService consensusService = Mockito.mocker(TransactionService.class);
+// BlockchainQueryService queryService = Mockito.mocker(BlockchainQueryService.class);
+//
+// HashDigest txContentHash =CryptoUtils.hash(CryptoAlgorithm.SHA_256).hash(UUID.randomUUID().toString().getBytes("UTF-8"));
+// TxResponseMessage expectedResponse = new TxResponseMessage(txContentHash);
+// expectedResponse.setExecutionState(ExecutionState.SUCCESS);
+//
+// when(consensusService.process(argThat(txReqCaptor))).thenReturn(expectedResponse);
+//
+// HashDigest ledgerHash = CryptoUtils.hash(CryptoAlgorithm.SHA_256).hash(UUID.randomUUID().toString().getBytes("UTF-8"));
+//
+// BlockchainTransactionService serviceProxy = new BlockchainServiceProxy(consensusService, queryService);
+//
+// TransactionTemplate txTemplate = serviceProxy.newTransaction(ledgerHash);
+// txTemplate.setSubject(subjectAccount.getAddress(), sequenceNumber);
+//
+// BlockchainKeyPair regAccountKeyPair = BlockchainKeyGenerator.getInstance().generate(CryptoKeyType.ED25519);
+// AccountStateType stateType = AccountStateType.MAP;
+// txTemplate.users().register(regAccountKeyPair.getIdentity(), stateType);
+//
+// PreparedTransaction prepTx = txTemplate.prepare();
+// HashDigest txHash = prepTx.getHash();
+// prepTx.sign(sponsorAccount);
+//
+// TransactionResponse result = prepTx.commit();
+//
+// // 验证;
+// // 仅被提交一次;
+// verify(consensusService, times(1)).process(any());
+//
+// assertEquals(ExecutionState.SUCCESS, result.getExecutionState());
+//
+// // 验证内容;
+// TransactionRequest resolvedTxRequest = txReqCaptor.getArg();
+//
+// TransactionContent resolvedTxContent = resolvedTxRequest.getTransactionContent();
+//
+// assertEquals(txHash, resolvedTxContent.getHash());
+//
+// assertEquals(subjectAccount.getAddress(), resolvedTxContent.getSubjectAccount());
+// assertEquals(sequenceNumber, resolvedTxContent.getSequenceNumber());
+//
+//
+// Operation[] resolvedOps = resolvedTxContent.getOperations();
+// assertEquals(1, resolvedOps.length);
+// Operation resolvedOP = resolvedOps[0];
+//// assertEquals(OperationType.REGISTER_USER.CODE, resolvedOP.getCode());
+//
+// UserRegisterOpTemplate accRegOP = new UserRegisterOpTemplate();
+// accRegOP.resolvFrom((OpBlob) resolvedOP);
+//
+// assertEquals(regAccountKeyPair.getAddress(), accRegOP.getId().getAddress());
+// assertEquals(regAccountKeyPair.getPubKey().getType(), accRegOP.getId().getPubKey().getType());
+// assertEquals(regAccountKeyPair.getPubKey().getValue(), accRegOP.getId().getPubKey().getValue());
+// assertEquals(stateType, accRegOP.getStateType());
+// }
+
+}
diff --git a/source/sdk/sdk-mq/pom.xml b/source/sdk/sdk-mq/pom.xml
deleted file mode 100644
index 5a735573..00000000
--- a/source/sdk/sdk-mq/pom.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-
-
-
-
- sdk
- com.jd.blockchain
- 0.9.0-SNAPSHOT
-
- 4.0.0
-
- sdk-mq
-
-
- UTF-8
- 1.8
- 1.8
-
-
-
-
- junit
- junit
- 4.11
- test
-
-
- com.jd.blockchain
- sdk-base
- ${project.version}
-
-
- com.lmax
- disruptor
-
-
- io.nats
- jnats
-
-
-
-
-
-
-
diff --git a/source/state-transfer/pom.xml b/source/state-transfer/pom.xml
deleted file mode 100644
index d17c8e03..00000000
--- a/source/state-transfer/pom.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-
- 4.0.0
-
- com.jd.blockchain
- jdchain-root
- 0.9.0-SNAPSHOT
-
- state-transfer
-
-
-
- com.jd.blockchain
- stp-communication
- ${project.version}
-
-
- com.jd.blockchain
- utils-common
- ${project.version}
-
-
-
- com.jd.blockchain
- utils-serialize
- ${project.version}
-
-
-
-
-
-
-
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequence.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequence.java
deleted file mode 100644
index 237a6d47..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequence.java
+++ /dev/null
@@ -1,75 +0,0 @@
-package com.jd.blockchain.statetransfer;
-
-import java.net.InetSocketAddress;
-import java.util.LinkedList;
-
-/**
- * 测试过程建立的一个数据序列
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- */
-public class DataSequence {
-
- private InetSocketAddress address;
- private String id;
-
- // 每个数据序列维护了一系列的数据序列元素
- private LinkedList dataSequenceElements = new LinkedList<>();
-
-
- public DataSequence(InetSocketAddress address, String id) {
- this.address = address;
- this.id = id;
- }
-
- public String getId() {
- return id;
- }
-
- public InetSocketAddress getAddress() {
- return address;
- }
-
-
- public void addElements(DataSequenceElement[] elements) {
- for (DataSequenceElement element : elements) {
- addElement(element);
- }
- }
-
- public void addElement(DataSequenceElement element) {
- try {
- if (dataSequenceElements.size() == 0) {
- if (element.getHeight() != 0) {
- throw new IllegalArgumentException("Data sequence add element height error!");
- }
- dataSequenceElements.addLast(element);
- }
- else {
- if (dataSequenceElements.getLast().getHeight() != element.getHeight() - 1) {
- throw new IllegalArgumentException("Data sequence add element height error!");
- }
- dataSequenceElements.addLast(element);
- }
-
- } catch (Exception e) {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
- }
-
- public LinkedList getDataSequenceElements() {
- return dataSequenceElements;
- }
-
- public DataSequenceInfo getDSInfo() {
- if (dataSequenceElements.size() == 0) {
- return new DataSequenceInfo(id, -1);
- }
- else {
- return new DataSequenceInfo(id, dataSequenceElements.getLast().getHeight());
- }
- }
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequenceElement.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequenceElement.java
deleted file mode 100644
index aaf6e7f5..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequenceElement.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package com.jd.blockchain.statetransfer;
-
-import java.io.Serializable;
-
-/**
- * 数据序列需要复制内容的元素或单位
- * @author zhangshuang
- * @create 2019/4/11
- * @since 1.0.0
- */
-public class DataSequenceElement implements Serializable {
-
- private static final long serialVersionUID = -719578198150380571L;
-
- //数据序列的唯一标识符;
- private String id;
-
- //数据序列的某个高度;
- private long height;
-
- //对应某个高度的数据序列内容
- private byte[][] data;
-
- public DataSequenceElement(String id, long height, byte[][] data) {
- this.id = id;
- this.height = height;
- this.data = data;
- }
-
- public long getHeight() {
- return height;
- }
-
- public void setHeight(long height) {
- this.height = height;
- }
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- id = id;
- }
-
- public byte[][] getData() {
- return data;
- }
-
- public void setData(byte[][] data) {
- this.data = data;
- }
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequenceInfo.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequenceInfo.java
deleted file mode 100644
index 6f0f2e10..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/DataSequenceInfo.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.jd.blockchain.statetransfer;
-
-/**
- * 共识结点上的某个数据序列的当前状态信息,每个共识结点可以对应任意个数据序列;
- * @author zhangshuang
- * @create 2019/4/11
- * @since 1.0.0
- */
-public class DataSequenceInfo {
-
- //数据序列的唯一标识
- private String id;
-
- //数据序列的当前高度
- private long height;
-
- public DataSequenceInfo(String id, long height) {
- this.id = id;
- this.height = height;
- }
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public long getHeight() {
- return height;
- }
-
- public void setHeight(long height) {
- this.height = height;
- }
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceReader.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceReader.java
deleted file mode 100644
index e137b929..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceReader.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.jd.blockchain.statetransfer.callback;
-
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.DataSequenceInfo;
-
-/**
- * 数据序列差异提供者需要使用的回调接口
- * @author zhangshuang
- * @create 2019/4/11
- * @since 1.0.0
- */
-public interface DataSequenceReader {
-
- /**
- * 差异提供者根据数据序列标识符获取数据序列当前状态;
- * @param id 数据序列标识符
- * @return 数据序列当前状态信息
- */
- DataSequenceInfo getDSInfo(String id);
-
-
- /**
- * 差异提供者根据数据序列标识符以及起始,结束高度提供数据序列该范围的差异内容;
- * @param id 数据序列标识符
- * @param from 差异的起始高度
- * @param to 差异的结束高度
- * @return 差异元素组成的数组
- */
- DataSequenceElement[] getDSDiffContent(String id, long from, long to);
-
-
- /**
- * 差异提供者根据数据序列标识符以及高度提供数据序列的差异内容;
- * @param id 数据序列标识符
- * @param height 要获得哪个高度的差异元素
- * @return 差异元素
- */
- DataSequenceElement getDSDiffContent(String id, long height);
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceReaderImpl.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceReaderImpl.java
deleted file mode 100644
index 3d581b2d..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceReaderImpl.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package com.jd.blockchain.statetransfer.callback;
-
-import com.jd.blockchain.statetransfer.DataSequence;
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.DataSequenceInfo;
-
-import java.util.LinkedList;
-
-/**
- * 数据序列差异的提供者需要使用的回调接口实现类
- * @author zhangshuang
- * @create 2019/4/22
- * @since 1.0.0
- */
-
-public class DataSequenceReaderImpl implements DataSequenceReader {
-
- DataSequence currDataSequence;
-
- public DataSequenceReaderImpl(DataSequence currDataSequence) {
- this.currDataSequence = currDataSequence;
- }
-
- @Override
- public DataSequenceInfo getDSInfo(String id) {
- return currDataSequence.getDSInfo();
- }
-
- @Override
- public DataSequenceElement[] getDSDiffContent(String id, long from, long to) {
- DataSequenceElement[] elements = new DataSequenceElement[(int)(to - from + 1)];
-
- int i = 0;
- LinkedList dataSequenceElements = currDataSequence.getDataSequenceElements();
- for (DataSequenceElement element : dataSequenceElements) {
- if (element.getHeight() < from || element.getHeight() > to) {
- continue;
- }
- else {
- elements[i++] = element;
- }
- }
-
- return elements;
-
- }
-
- @Override
- public DataSequenceElement getDSDiffContent(String id, long height) {
- for(DataSequenceElement dataSequenceElement : currDataSequence.getDataSequenceElements()) {
- if (dataSequenceElement.getHeight() == height) {
- return dataSequenceElement;
-
- }
- }
- return null;
- }
-}
-
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceWriter.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceWriter.java
deleted file mode 100644
index b45eb3ac..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceWriter.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.jd.blockchain.statetransfer.callback;
-
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.DataSequenceInfo;
-
-/**
- * 数据序列差异请求者获得差异内容后需要回调该接口
- * @author zhangshuang
- * @create 2019/4/11
- * @since 1.0.0
- */
-public interface DataSequenceWriter {
-
- /**
- * 差异请求者更新本地数据序列的状态,一次可以更新多个差异元素
- * @param dsInfo 数据序列当前状态信息
- * @param diffContents 需要更新的差异元素数组
- * @return 更新结果编码
- */
- int updateDSInfo(DataSequenceInfo dsInfo, DataSequenceElement[] diffContents);
-
- /**
- * 差异请求者更新本地数据序列的状态,一次只更新一个差异元素
- * @param dsInfo 数据序列当前状态信息
- * @param diffContent 需要更新的差异元素
- * @return 更新结果编码
- */
-// int updateDSInfo(DataSequenceInfo dsInfo, DataSequenceElement diffContent);
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceWriterImpl.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceWriterImpl.java
deleted file mode 100644
index c510e843..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/callback/DataSequenceWriterImpl.java
+++ /dev/null
@@ -1,142 +0,0 @@
-package com.jd.blockchain.statetransfer.callback;
-
-import com.jd.blockchain.statetransfer.DataSequence;
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.DataSequenceInfo;
-
-import java.util.ArrayList;
-
-/**
- * 数据序列差异的请求者需要使用的回调接口实现类
- * @author zhangshuang
- * @create 2019/4/22
- * @since 1.0.0
- */
-public class DataSequenceWriterImpl implements DataSequenceWriter {
-
- private long currHeight;
- private DataSequence currDataSequence;
- private ArrayList deceidedElements = new ArrayList();
-
- public DataSequenceWriterImpl(DataSequence currDataSequence) {
- this.currDataSequence = currDataSequence;
- }
-
- /**
- * 检查数据序列差异元素中的高度是否合理;
- * @param currHeight 当前结点的账本高度
- * @param dsUpdateElements 需要更新到本地结点的数据序列元素List
- * @return
- */
- private int checkElementsHeight(long currHeight, ArrayList dsUpdateElements) {
- boolean lossMiddleElements = false;
-
- // lose first element
- if (currHeight + 1 < dsUpdateElements.get(0).getHeight()){
- System.out.println("Diff response loss first element error!");
- return DataSequenceErrorType.DATA_SEQUENCE_LOSS_FIRST_ELEMENT.CODE;
- }
- else {
- for (int i = 0; i < dsUpdateElements.size(); i++) {
- if (dsUpdateElements.get(i).getHeight() == currHeight + 1 + i) {
- deceidedElements.add(dsUpdateElements.get(i));
- }
- // lose middle elements
- else {
- lossMiddleElements = true;
- break;
- }
- }
-
- if (lossMiddleElements) {
- System.out.println("Diff response loss middle elements error!");
- return DataSequenceErrorType.DATA_SEQUENCE_LOSS_MIDDLE_ELEMENT.CODE;
- }
-
- System.out.println("Diff response elements height normal!");
- return DataSequenceErrorType.DATA_SEQUENCE_ELEMENT_HEIGHT_NORMAL.CODE;
- }
-
- }
-
- @Override
- public int updateDSInfo(DataSequenceInfo dsInfo, DataSequenceElement[] diffContents) {
-
- int result = 0;
-
- try {
- ArrayList dsUpdateElements = new ArrayList();
-
- if (diffContents == null) {
- throw new IllegalArgumentException("Update diffContents is null!");
- }
-
- //remove unexpected elements
- for (int i = 0 ; i < diffContents.length; i++) {
- if (diffContents[i].getId().equals(dsInfo.getId())) {
- dsUpdateElements.add(diffContents[i]);
- }
- }
-
- currHeight = dsInfo.getHeight();
-
- // check element's height
- result = checkElementsHeight(currHeight, dsUpdateElements);
-
- // cann't exe update
- if (result == DataSequenceErrorType.DATA_SEQUENCE_LOSS_FIRST_ELEMENT.CODE) {
- return result;
- }
- // exe elements update
- else {
- System.out.println("Old data sequence state: ");
- System.out.println(" Current height = " + currDataSequence.getDataSequenceElements().getLast().getHeight());
- currDataSequence.addElements(deceidedElements.toArray(new DataSequenceElement[deceidedElements.size()]));
-
- System.out.println("Update diffContents is completed!");
- System.out.println("New data sequence state: ");
- System.out.println(" Current height = " + currDataSequence.getDataSequenceElements().getLast().getHeight());
-
- return result;
- }
-
-
-
- } catch (Exception e) {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
-
- return DataSequenceErrorType.DATA_SEQUENCE_ELEMENT_HEIGHT_NORMAL.CODE;
-
- }
-
-// @Override
-// public int updateDSInfo(DataSequenceInfo dsInfo, DataSequenceElement diffContent) {
-// currDataSequence.addElement(diffContent);
-// return DataSequenceErrorType.DATA_SEQUENCE_ELEMENT_HEIGHT_NORMAL.CODE;
-// }
-
- public enum DataSequenceErrorType {
- DATA_SEQUENCE_LOSS_FIRST_ELEMENT((byte) 0x1),
- DATA_SEQUENCE_LOSS_MIDDLE_ELEMENT((byte) 0x2),
- DATA_SEQUENCE_ELEMENT_HEIGHT_NORMAL((byte) 0x3),
- ;
- public final int CODE;
-
- private DataSequenceErrorType(byte code) {
- this.CODE = code;
- }
-
- public static DataSequenceErrorType valueOf(byte code) {
- for (DataSequenceErrorType errorType : DataSequenceErrorType.values()) {
- if (errorType.CODE == code) {
- return errorType;
- }
- }
- throw new IllegalArgumentException("Unsupported code[" + code + "] of errorType!");
- }
- }
-
-}
-
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/comparator/DataSequenceComparator.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/comparator/DataSequenceComparator.java
deleted file mode 100644
index 9e0afbe5..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/comparator/DataSequenceComparator.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package com.jd.blockchain.statetransfer.comparator;
-
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-
-import java.util.Comparator;
-
-/**
- * 数据序列差异元素的高度比较器
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- */
-public class DataSequenceComparator implements Comparator {
-
- // sort by data sequence height
- /**
- * 对差异元素根据高度大小排序
- * @param o1 差异元素1
- * @param o2 差异元素2
- * @return >0 or <0
- */
- @Override
- public int compare(DataSequenceElement o1, DataSequenceElement o2) {
- long height1;
- long height2;
-
- height1 = o1.getHeight();
- height2 = o2.getHeight();
-
- return (int) (height1 - height2);
- }
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/exception/DataSequenceException.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/exception/DataSequenceException.java
deleted file mode 100644
index 5e6248c0..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/exception/DataSequenceException.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.jd.blockchain.statetransfer.exception;
-
-/**
- * 数据序列异常处理
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- */
-public class DataSequenceException extends RuntimeException {
-
- private static final long serialVersionUID = -4090881296855827889L;
-
-
- public DataSequenceException(String message) {
- super(message);
- }
- public DataSequenceException(String message, Throwable cause) {
- super(message, cause);
- }
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DSDefaultMessageExecutor.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DSDefaultMessageExecutor.java
deleted file mode 100644
index 6c67e8c8..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DSDefaultMessageExecutor.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.jd.blockchain.statetransfer.message;
-
-import com.jd.blockchain.statetransfer.callback.DataSequenceReader;
-import com.jd.blockchain.statetransfer.callback.DataSequenceWriter;
-import com.jd.blockchain.statetransfer.process.DSTransferProcess;
-import com.jd.blockchain.statetransfer.result.DSDiffRequestResult;
-import com.jd.blockchain.stp.communication.MessageExecutor;
-import com.jd.blockchain.stp.communication.RemoteSession;
-
-/**
- * 数据序列差异提供者使用,解析收到的差异请求消息并产生响应
- * @author zhangshuang
- * @create 2019/4/11
- * @since 1.0.0
- */
-public class DSDefaultMessageExecutor implements MessageExecutor {
-
- DataSequenceReader dsReader;
- DataSequenceWriter dsWriter;
-
- public DSDefaultMessageExecutor(DataSequenceReader dsReader, DataSequenceWriter dsWriter) {
- this.dsReader = dsReader;
- this.dsWriter = dsWriter;
- }
-
- /**
- * 对状态机复制的差异请求进行响应
- * @param key 请求消息的Key
- * @param data 需要解码的字节数组
- * @param session 指定响应需要使用的目标结点会话
- * @return 配置为自动响应时,返回值为响应的字节数组,配置为手动响应时,不需要关注返回值
- */
-
- @Override
- public byte[] receive(String key, byte[] data, RemoteSession session) {
-
- try {
- Object object = DSMsgResolverFactory.getDecoder(dsWriter, dsReader).decode(data);
-
- // 解析CMD_DSINFO_REQUEST 请求的情况
- if (object instanceof String) {
- String id = (String)object;
- byte[] respLoadMsg = DSMsgResolverFactory.getEncoder(dsWriter, dsReader).encode(DSTransferProcess.DataSequenceMsgType.CMD_DSINFO_RESPONSE, id, 0, 0);
- session.reply(key, new DataSequenceLoadMessage(respLoadMsg));
- }
- // 解析CMD_GETDSDIFF_REQUEST 请求的情况
- else if (object instanceof DSDiffRequestResult) {
-
- DSDiffRequestResult requestResult = (DSDiffRequestResult)object;
- String id = requestResult.getId();
- long fromHeight = requestResult.getFromHeight();
- long toHeight = requestResult.getToHeight();
- //每个高度的数据序列差异元素进行一次响应的情况
- for (long i = fromHeight; i < toHeight + 1; i++) {
- byte[] respLoadMsg = DSMsgResolverFactory.getEncoder(dsWriter, dsReader).encode(DSTransferProcess.DataSequenceMsgType.CMD_GETDSDIFF_RESPONSE, id, i, i);
- session.reply(key, new DataSequenceLoadMessage(respLoadMsg));
- }
- //所有差异进行一次响应的情况
- }
- else {
- throw new IllegalArgumentException("Receive data exception, unknown message type!");
- }
-
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- return null;
- }
-
- /**
- * 响应类型设置
- * 分手动响应,自动响应两种类型
- */
- @Override
- public REPLY replyType() {
- return REPLY.MANUAL;
- }
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DSMsgResolverFactory.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DSMsgResolverFactory.java
deleted file mode 100644
index c0dfae8d..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DSMsgResolverFactory.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.jd.blockchain.statetransfer.message;
-
-import com.jd.blockchain.statetransfer.callback.DataSequenceReader;
-import com.jd.blockchain.statetransfer.callback.DataSequenceWriter;
-
-/**
- * 数据序列消息解析器工厂
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- *
- */
-public class DSMsgResolverFactory {
-
- /**
- * 获得数据序列消息编码器实例
- * @param dsWriter 差异请求者执行数据序列更新的执行器
- * @param dsReader 差异响应者执行数据序列读取的执行器
- * @return 消息编码器实例
- */
- public static DataSequenceMsgEncoder getEncoder(DataSequenceWriter dsWriter, DataSequenceReader dsReader) {
- return new DataSequenceMsgEncoder(dsWriter, dsReader);
- }
-
- /**
- * 获得数据序列消息解码器实例
- * @param dsWriter 差异请求者执行数据序列更新的执行器
- * @param dsReader 差异响应者执行数据序列读取的执行器
- * @return 消息解码器实例
- */
- public static DataSequenceMsgDecoder getDecoder(DataSequenceWriter dsWriter, DataSequenceReader dsReader) {
- return new DataSequenceMsgDecoder(dsWriter, dsReader);
- }
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceLoadMessage.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceLoadMessage.java
deleted file mode 100644
index a4131e61..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceLoadMessage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.jd.blockchain.statetransfer.message;
-
-import com.jd.blockchain.stp.communication.message.LoadMessage;
-
-/**
- * 数据序列复制的负载消息
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- *
- */
-public class DataSequenceLoadMessage implements LoadMessage {
-
- byte[] bytes;
-
- public DataSequenceLoadMessage(byte[] bytes) {
- this.bytes = bytes;
- }
-
- public void setBytes(byte[] bytes) {
- this.bytes = bytes;
- }
-
- @Override
- public byte[] toBytes() {
- return bytes;
- }
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceMsgDecoder.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceMsgDecoder.java
deleted file mode 100644
index 6bfa4c97..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceMsgDecoder.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package com.jd.blockchain.statetransfer.message;
-
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.DataSequenceInfo;
-import com.jd.blockchain.statetransfer.callback.DataSequenceReader;
-import com.jd.blockchain.statetransfer.callback.DataSequenceWriter;
-import com.jd.blockchain.statetransfer.process.DSTransferProcess;
-import com.jd.blockchain.statetransfer.result.DSDiffRequestResult;
-import com.jd.blockchain.utils.io.BytesUtils;
-import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils;
-
-/**
- * 数据序列消息解码器
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- */
-public class DataSequenceMsgDecoder {
-
- private int heightSize = 8;
- private int msgTypeSize = 1;
-
- private long respHeight;
- private long fromHeight;
- private long toHeight;
- private int idSize;
- private byte[] idBytes;
- private String id;
- private int diffElemSize;
- private byte[] diffElem;
- DataSequenceElement dsElement;
-
- private DataSequenceWriter dsWriter;
- private DataSequenceReader dsReader;
-
- public DataSequenceMsgDecoder(DataSequenceWriter dsWriter, DataSequenceReader dsReader) {
- this.dsWriter = dsWriter;
- this.dsReader = dsReader;
- }
-
-
- /**
- * 对编过码的字节数组解码,还原成对象实例
- * @param loadMessage 字节序列
- * @return 解码后的对象
- */
- public Object decode(byte[] loadMessage) {
-
- try {
- if (loadMessage.length <= 5) {
- System.out.println("LoadMessage size is less than 5!");
- throw new IllegalArgumentException();
- }
-
- int dataLength = BytesUtils.toInt(loadMessage, 0, 4);
- byte msgCode = loadMessage[4];
-
- // send by diff provider, diff requester decode
- if (msgCode == DSTransferProcess.DataSequenceMsgType.CMD_DSINFO_RESPONSE.CODE) {
- respHeight = BytesUtils.toLong(loadMessage, 4 + msgTypeSize);
- idSize = BytesUtils.toInt(loadMessage, 4 + msgTypeSize + heightSize, 4);
- idBytes = new byte[idSize];
- System.arraycopy(loadMessage, 4 + msgTypeSize + heightSize + 4, idBytes, 0, idSize);
- id = new String(idBytes);
- return new DataSequenceInfo(id, respHeight);
- }
- // send by diff provider, diff requester decode
- else if (msgCode == DSTransferProcess.DataSequenceMsgType.CMD_GETDSDIFF_RESPONSE.CODE) {
- diffElemSize = BytesUtils.toInt(loadMessage, 4 + msgTypeSize, 4);
- diffElem = new byte[diffElemSize];
- System.arraycopy(loadMessage, 4 + msgTypeSize + 4, diffElem, 0, diffElemSize);
- dsElement = BinarySerializeUtils.deserialize(diffElem);
- return dsElement;
- }
- // send by diff requester, diff provider decode
- else if (msgCode == DSTransferProcess.DataSequenceMsgType.CMD_DSINFO_REQUEST.CODE) {
- idSize = BytesUtils.toInt(loadMessage, 4 + msgTypeSize, 4);
- idBytes = new byte[idSize];
- System.arraycopy(loadMessage, 4 + msgTypeSize + 4, idBytes, 0, idSize);
- id = new String(idBytes);
- return id;
- }
- // send by diff requester, diff provider decode
- else if (msgCode == DSTransferProcess.DataSequenceMsgType.CMD_GETDSDIFF_REQUEST.CODE) {
- fromHeight = BytesUtils.toLong(loadMessage, 4 + msgTypeSize);
- toHeight = BytesUtils.toLong(loadMessage, 4 + msgTypeSize + heightSize);
- idSize = BytesUtils.toInt(loadMessage, 4 + msgTypeSize + heightSize + heightSize, 4);
- idBytes = new byte[idSize];
- System.arraycopy(loadMessage, 4 + msgTypeSize + heightSize + heightSize + 4, idBytes, 0, idSize);
- id = new String(idBytes);
- return new DSDiffRequestResult(id, fromHeight, toHeight);
- }
- else {
- System.out.println("Unknown message type!");
- throw new IllegalArgumentException();
- }
-
- } catch (Exception e) {
- System.out.println("Error to decode message: " + e.getMessage() + "!");
- e.printStackTrace();
-
- }
-
- return null;
- }
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceMsgEncoder.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceMsgEncoder.java
deleted file mode 100644
index 71b3ef4c..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/message/DataSequenceMsgEncoder.java
+++ /dev/null
@@ -1,133 +0,0 @@
-package com.jd.blockchain.statetransfer.message;
-
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.callback.DataSequenceReader;
-import com.jd.blockchain.statetransfer.callback.DataSequenceWriter;
-import com.jd.blockchain.statetransfer.process.DSTransferProcess;
-import com.jd.blockchain.utils.io.BytesUtils;
-import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils;
-
-/**
- * 数据序列消息编码器
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- */
-public class DataSequenceMsgEncoder {
-
- private int heightSize = 8;
- private int msgTypeSize = 1;
-
- private DataSequenceWriter dsWriter;
- private DataSequenceReader dsReader;
-
- public DataSequenceMsgEncoder(DataSequenceWriter dsWriter, DataSequenceReader dsReader) {
- this.dsWriter = dsWriter;
- this.dsReader = dsReader;
- }
-
- /**
- * 目前暂时考虑fromHeight与toHeight相同的情况,即每次只对一个高度的差异内容进行编码并响应
- * 把消息编码成字节数组,再交给通信层传输
- * @param msgType 数据序列状态复制消息类型
- * @param id 数据序列唯一标识符
- * @param fromHeight 差异元素起始高度
- * @param toHeight 差异元素结束高度
- */
- public byte[] encode(DSTransferProcess.DataSequenceMsgType msgType, String id, long fromHeight, long toHeight) {
-
- try {
-
- int dataLength;
- int idSize = id.getBytes().length;
- byte[] loadMessage = null;
-
- // different encoding methods for different message types
- // send by diff requester, diff requester encode
- if (msgType == DSTransferProcess.DataSequenceMsgType.CMD_DSINFO_REQUEST) {
-
- // CMD_DSINFO_REQUEST Message parts : 4 bytes total message size, 1 byte message type coe,
- // 4 bytes id length, id content size bytes
-
- dataLength = 4 + msgTypeSize + 4 + idSize;
-
- loadMessage = new byte[dataLength];
-
- System.arraycopy(BytesUtils.toBytes(dataLength), 0, loadMessage, 0, 4);
- loadMessage[4] = msgType.CODE;
- System.arraycopy(BytesUtils.toBytes(idSize), 0, loadMessage, 4 + msgTypeSize, 4);
- System.arraycopy(id.getBytes(), 0, loadMessage, 4 + msgTypeSize + 4, idSize);
- }
- // send by diff requester, diff requester encode
- else if (msgType == DSTransferProcess.DataSequenceMsgType.CMD_GETDSDIFF_REQUEST) {
-
- // CMD_GETDSDIFF_REQUEST Message parts : 4 bytes total message size, 1 byte message type coe, 8 bytes from height,
- // 8 bytes to height, 4 bytes id length, id content size bytes
-
- dataLength = 4 + msgTypeSize + heightSize + heightSize + 4 + idSize;
-
- loadMessage = new byte[dataLength];
-
- System.arraycopy(BytesUtils.toBytes(dataLength), 0, loadMessage, 0, 4);
- loadMessage[4] = msgType.CODE;
- System.arraycopy(BytesUtils.toBytes(fromHeight), 0, loadMessage, 4 + msgTypeSize, heightSize);
- System.arraycopy(BytesUtils.toBytes(toHeight), 0, loadMessage, 4 + msgTypeSize + heightSize, heightSize);
- System.arraycopy(BytesUtils.toBytes(idSize), 0, loadMessage, 4 + msgTypeSize + heightSize + heightSize, 4);
- System.arraycopy(id.getBytes(), 0, loadMessage, 4 + msgTypeSize + heightSize + heightSize + 4, idSize);
- }
- // send by diff provider, diff provider encode
- else if (msgType == DSTransferProcess.DataSequenceMsgType.CMD_DSINFO_RESPONSE) {
-
- // CMD_DSINFO_RESPONSE Message parts : 4 bytes total message size, 1 byte message type coe, 8 bytes data sequence local height,
- // 4 bytes id length, id content size bytes
-
- dataLength = 4 + msgTypeSize + heightSize + 4 + idSize;
-
- loadMessage = new byte[dataLength];
-
- System.arraycopy(BytesUtils.toBytes(dataLength), 0, loadMessage, 0, 4);
- loadMessage[4] = msgType.CODE;
- System.arraycopy(BytesUtils.toBytes(dsReader.getDSInfo(id).getHeight()), 0, loadMessage, 4 + msgTypeSize, heightSize);
-
- System.arraycopy(BytesUtils.toBytes(idSize), 0, loadMessage, 4 + msgTypeSize + heightSize, 4);
- System.arraycopy(id.getBytes(), 0, loadMessage, 4 + msgTypeSize + heightSize + 4, idSize);
-
- }
- // send by diff provider, diff provider encode
- else if (msgType == DSTransferProcess.DataSequenceMsgType.CMD_GETDSDIFF_RESPONSE) {
- if (fromHeight != toHeight) {
- throw new IllegalArgumentException("Height parameter error!");
- }
-
- // CMD_DSINFO_RESPONSE Message parts : 4 bytes total message size, 1 byte message type coe,
- // 4 bytes diffElem size, diff content size;
-
- // 回调reader,获得这个高度上的所有差异的数据序列内容,并组织成DataSequenceElement结构
- DataSequenceElement element = dsReader.getDSDiffContent(id, fromHeight);
-
- byte[] diffElem = BinarySerializeUtils.serialize(element);
-
- dataLength = 4 + msgTypeSize + 4 + diffElem.length;
- loadMessage = new byte[dataLength];
-
- System.arraycopy(BytesUtils.toBytes(dataLength), 0, loadMessage, 0, 4); //total size
- loadMessage[4] = msgType.CODE; //msgType size
- System.arraycopy(BytesUtils.toBytes(diffElem.length), 0, loadMessage, 4 + msgTypeSize, 4); // diffElem size
- System.arraycopy(diffElem, 0, loadMessage, 4 + msgTypeSize + 4, diffElem.length); // diffElem bytes
- }
- else {
- System.out.println("Unknown message type!");
- throw new IllegalArgumentException();
- }
-
- return loadMessage;
-
- } catch (Exception e) {
- System.out.println("Error to encode message type : " + msgType + "!");
- e.printStackTrace();
- }
-
- return null;
- }
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/process/DSProcessManager.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/process/DSProcessManager.java
deleted file mode 100644
index 97b14602..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/process/DSProcessManager.java
+++ /dev/null
@@ -1,186 +0,0 @@
-package com.jd.blockchain.statetransfer.process;
-
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.DataSequenceInfo;
-import com.jd.blockchain.statetransfer.callback.DataSequenceReader;
-import com.jd.blockchain.statetransfer.callback.DataSequenceWriter;
-import com.jd.blockchain.statetransfer.comparator.DataSequenceComparator;
-import com.jd.blockchain.statetransfer.message.DSDefaultMessageExecutor;
-import com.jd.blockchain.statetransfer.result.DSInfoResponseResult;
-import com.jd.blockchain.stp.communication.RemoteSession;
-import com.jd.blockchain.stp.communication.callback.CallBackBarrier;
-import com.jd.blockchain.stp.communication.callback.CallBackDataListener;
-import com.jd.blockchain.stp.communication.manager.RemoteSessionManager;
-import com.jd.blockchain.stp.communication.node.LocalNode;
-import com.jd.blockchain.stp.communication.node.RemoteNode;
-
-import java.net.InetSocketAddress;
-import java.util.*;
-import java.util.concurrent.*;
-
-/**
- * 数据序列状态复制过程管理器
- * @author zhangshuang
- * @create 2019/4/11
- * @since 1.0.0
- *
- */
-public class DSProcessManager {
-
- private static Map dSProcessMap = new ConcurrentHashMap<>();
- private RemoteSession[] remoteSessions;
- private long dsInfoResponseTimeout = 20000;
- private ExecutorService writeExecutors = Executors.newFixedThreadPool(5);
- private int returnCode = 0;
-
- /**
- * 启动一个指定数据序列的状态复制过程
- * @param dsInfo 数据序列当前状态信息
- * @param listener 本地监听者
- * @param targets 目标结点
- * @param dsWriter 差异请求者执行数据序列更新的执行器
- * @param dsReader 差异响应者执行数据序列读取的执行器
- * @return returnCode 执行结果码
- */
- public int startDSProcess(DataSequenceInfo dsInfo, InetSocketAddress listener, InetSocketAddress[] targets, DataSequenceWriter dsWriter, DataSequenceReader dsReader) {
-
- // create remote sessions manager, add listener
- LocalNode listenNode = new LocalNode(listener.getHostName(), listener.getPort(), new DSDefaultMessageExecutor(dsReader, dsWriter));
-
- RemoteSessionManager remoteSessionManager = new RemoteSessionManager(listenNode);
-
- // data sequence transfer process life cycle start
- DSTransferProcess dsTransferProcess = new DSTransferProcess(dsInfo, targets);
- dsTransferProcess.setDSReader(dsReader);
- dsTransferProcess.setDSWriter(dsWriter);
- dsTransferProcess.setRemoteSessionManager(remoteSessionManager);
-
- dSProcessMap.put(dsInfo.getId(), dsTransferProcess);
-
- try {
-
- //wait all listener nodes start
- Thread.sleep(2000);
-
- // start network connections with targets
- dsTransferProcess.start();
-
- //get all target sessions
- remoteSessions = dsTransferProcess.getSessions();
-
- // async message send process
- CallBackBarrier callBackBarrier = CallBackBarrier.newCallBackBarrier(remoteSessions.length, dsInfoResponseTimeout);
-
- // response message manage map
- LinkedList dsInfoResponses = new LinkedList<>();
-
- System.out.println("Async send CMD_DSINFO_REQUEST msg to targets will start!");
- // step1: send get dsInfo request, then hold
- for (RemoteSession remoteSession : remoteSessions) {
- CallBackDataListener dsInfoResponse = dsTransferProcess.send(DSTransferProcess.DataSequenceMsgType.CMD_DSINFO_REQUEST, remoteSession, 0, 0, callBackBarrier);
- dsInfoResponses.addLast(dsInfoResponse);
- }
-
- System.out.println("Wait CMD_DSINFO_RESPONSE msg from targets!");
- // step2: collect get dsInfo response
- LinkedList receiveResponses = new LinkedList<>();
- if (callBackBarrier.tryCall()) {
- Iterator iterator = dsInfoResponses.iterator();
- while (iterator.hasNext()) {
- CallBackDataListener receiveResponse = iterator.next();
- if (receiveResponse.isDone()) {
- receiveResponses.addLast(receiveResponse);
- }
- }
- }
-
- System.out.printf("%s:%d Compute diff info!\r\n", listener.getHostName(), listener.getPort());
- // step3: process received responses
- DSInfoResponseResult diffResult = dsTransferProcess.computeDiffInfo(receiveResponses);
-
- System.out.printf("%s:%d Diff info result height = %x!\r\n", listener.getHostName(), listener.getPort(), diffResult.getMaxHeight());
-
- // height diff
- long diff = dsInfo.getHeight() - diffResult.getMaxHeight();
-
- if (diff == 0 || diff > 0) {
- System.out.printf("%s:%d No duplication is required!\r\n", listener.getHostName(), listener.getPort());
- // no duplication is required, life cycle ends
-// dsTransferProcess.close();
- dSProcessMap.remove(dsInfo.getId());
- return returnCode;
-
- }
- else {
- System.out.printf("%s:%d Duplication is required!\r\n", listener.getHostName(), listener.getPort());
- // step4: async send get data sequence diff request
- // single step get diff
- // async message send process
- CallBackBarrier callBackBarrierDiff = CallBackBarrier.newCallBackBarrier((int)(diffResult.getMaxHeight() - dsInfo.getHeight()), dsInfoResponseTimeout);
- LinkedList dsDiffResponses = new LinkedList<>();
-
- RemoteSession responseSession = findResponseSession(diffResult.getMaxHeightRemoteNode(), remoteSessions);
- System.out.println("Async send CMD_GETDSDIFF_REQUEST msg to targets will start!");
-
- // step5: collect get data sequence diff response
- for (long height = dsInfo.getHeight() + 1; height < diffResult.getMaxHeight() + 1; height++) {
- CallBackDataListener dsDiffResponse = dsTransferProcess.send(DSTransferProcess.DataSequenceMsgType.CMD_GETDSDIFF_REQUEST, responseSession, height, height, callBackBarrierDiff);
- dsDiffResponses.addLast(dsDiffResponse);
- }
- // 上述发送不合理,考虑一次性发送请求
- System.out.println("Wait CMD_GETDSDIFF_RESPONSE msg from targets!");
- LinkedList receiveDiffResponses = new LinkedList<>();
- if (callBackBarrierDiff.tryCall()) {
- for (int i = 0; i < dsDiffResponses.size(); i++) {
- CallBackDataListener asyncFutureDiff = dsDiffResponses.get(i);
- if (asyncFutureDiff.isDone()) {
- receiveDiffResponses.addLast(asyncFutureDiff.getCallBackData());
- }
- }
- }
-
- System.out.printf("%s:%d ReceiveDiffResponses size = %d !\r\n", listener.getHostName(), listener.getPort(), receiveDiffResponses.size());
- // step6: process data sequence diff response, update local data sequence state
- System.out.println("Compute diff elements!");
- ArrayList dataSequenceElements = dsTransferProcess.computeDiffElement(receiveDiffResponses.toArray(new byte[receiveDiffResponses.size()][]));
- System.out.println("Update local data sequence!");
- Collections.sort(dataSequenceElements, new DataSequenceComparator());
- returnCode = dsWriter.updateDSInfo(dsInfo, dataSequenceElements.toArray(new DataSequenceElement[dataSequenceElements.size()]));
-
- // data sequence transfer complete, close all sessions, end process life cycle
- System.out.println("Close all sessions");
-// dsTransferProcess.close();
- dSProcessMap.remove(dsInfo.getId());
- }
-
-
- } catch (Exception e) {
- e.printStackTrace();
- }
- return returnCode;
- }
-
- /**
- * 根据远端结点找与远端结点建立的会话
- * @param remoteNode 远端结点
- * @param remoteSessions 本地维护的远端结点会话表
- * @return 与远端结点对应的会话
- */
- RemoteSession findResponseSession(RemoteNode remoteNode, RemoteSession[] remoteSessions) {
- for (RemoteSession remoteSession : remoteSessions) {
- if (remoteSession.remoteNode().equals(remoteNode)) {
- return remoteSession;
- }
- }
- return null;
- }
- /**
- *
- *
- */
-// void setDSReader(DataSequenceReader reader) {
-//
-// }
-
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/process/DSTransferProcess.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/process/DSTransferProcess.java
deleted file mode 100644
index 45fc89fb..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/process/DSTransferProcess.java
+++ /dev/null
@@ -1,216 +0,0 @@
-package com.jd.blockchain.statetransfer.process;
-
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.DataSequenceInfo;
-import com.jd.blockchain.statetransfer.callback.DataSequenceReader;
-import com.jd.blockchain.statetransfer.callback.DataSequenceWriter;
-import com.jd.blockchain.statetransfer.message.DSMsgResolverFactory;
-import com.jd.blockchain.statetransfer.message.DataSequenceLoadMessage;
-import com.jd.blockchain.statetransfer.result.DSInfoResponseResult;
-import com.jd.blockchain.stp.communication.RemoteSession;
-import com.jd.blockchain.stp.communication.callback.CallBackBarrier;
-import com.jd.blockchain.stp.communication.callback.CallBackDataListener;
-import com.jd.blockchain.stp.communication.manager.RemoteSessionManager;
-import com.jd.blockchain.stp.communication.node.RemoteNode;
-import com.jd.blockchain.utils.IllegalDataException;
-
-import java.net.InetSocketAddress;
-import java.util.ArrayList;
-import java.util.LinkedList;
-import java.util.Map;
-
-/**
- * 数据序列状态复制过程
- * @author zhangshuang
- * @create 2019/4/11
- * @since 1.0.0
- */
-public class DSTransferProcess {
-
- private InetSocketAddress[] targets;
- private DataSequenceWriter dsWriter;
- private DataSequenceReader dsReader;
- private DataSequenceInfo dsInfo;
- private RemoteSessionManager remoteSessionManager;
- private RemoteSession[] remoteSessions;
- private String id;
-
- /**
- * @param dsInfo 数据序列当前状态信息
- * @param targets 目标结点
- */
- public DSTransferProcess(DataSequenceInfo dsInfo, InetSocketAddress[] targets) {
- this.dsInfo = dsInfo;
- this.targets = targets;
- this.id = dsInfo.getId();
- }
-
- /**
- * @param dsWriter 差异请求者执行数据序列更新的执行器
- * @return void
- */
- public void setDSWriter(DataSequenceWriter dsWriter) {
- this.dsWriter = dsWriter;
- }
-
- /**
- * @param dsReader 差异响应者执行数据序列读取的执行器
- * @return void
- */
- public void setDSReader(DataSequenceReader dsReader) {
- this.dsReader = dsReader;
- }
-
- /**
- * @param remoteSessionManager 远端会话管理器
- * @return void
- */
- public void setRemoteSessionManager(RemoteSessionManager remoteSessionManager) {
- this.remoteSessionManager = remoteSessionManager;
- }
-
-
- /**
- *
- * @return 数据序列标识符
- */
- public String getId() {
- return id;
- }
-
- /**
- * @param msgType 数据序列差异请求消息类型
- * @param remoteSession 目标结点对应的会话
- * @param fromHeight 差异起始高度
- * @param toHeight 差异结束高度
- * @param callBackBarrier 异步回调
- * @return 异步回调
- */
- CallBackDataListener send(DataSequenceMsgType msgType, RemoteSession remoteSession, long fromHeight, long toHeight, CallBackBarrier callBackBarrier) {
-
- byte[] loadMessage = DSMsgResolverFactory.getEncoder(dsWriter, dsReader).encode(msgType, id, fromHeight, toHeight);
-
- return remoteSession.asyncRequest(new DataSequenceLoadMessage(loadMessage), callBackBarrier);
- }
-
- /**
- * 计算数据序列差异元素数组
- * @param diffArray 差异的字节数组
- * @return 对差异字节数组的解码结果
- */
- public ArrayList computeDiffElement(byte[][] diffArray) {
-
- ArrayList dataSequenceElements = new ArrayList<>();
-
- for (int i = 0 ; i < diffArray.length; i++) {
- Object object = DSMsgResolverFactory.getDecoder(dsWriter, dsReader).decode(diffArray[i]);
- if (object instanceof DataSequenceElement) {
- dataSequenceElements.add((DataSequenceElement) object);
- }
- else {
- throw new IllegalDataException("Unknown instance object!");
- }
- }
-
- return dataSequenceElements;
- }
-
- /**
- * 根据差异提供者响应的数据序列状态信息找到拥有最大数据序列高度的远端结点
- * @param receiveResponses 数据序列差异请求者收到的远端结点状态的响应信息
- * @return 得到远端数据序列的最大高度以及拥有者结点
- */
- public DSInfoResponseResult computeDiffInfo(LinkedList receiveResponses) {
- long maxHeight = 0;
- RemoteNode maxHeightRemoteNode = null;
-
- System.out.println("ComputeDiffInfo receiveResponses size = "+ receiveResponses.size());
-
- try {
- for (CallBackDataListener receiveResponse : receiveResponses) {
- Object object = DSMsgResolverFactory.getDecoder(dsWriter, dsReader).decode(receiveResponse.getCallBackData());
- if (object instanceof DataSequenceInfo) {
- DataSequenceInfo dsInfo = (DataSequenceInfo) object;
- long height = dsInfo.getHeight();
- // sava max height and its remote node
- if (maxHeight < height) {
- maxHeight = height;
- maxHeightRemoteNode = receiveResponse.remoteNode();
- }
- }
- else {
- throw new IllegalDataException("Unknown instance object!");
- }
-
- }
- } catch (Exception e) {
- System.out.println(e.getMessage());
- e.printStackTrace();
- }
-
- return new DSInfoResponseResult(maxHeight, maxHeightRemoteNode);
- }
-
- /**
- * 获取本复制过程维护的远端会话表
- * @param
- * @return 远端会话表数组
- */
- public RemoteSession[] getSessions() {
- return remoteSessions;
- }
-
- /**
- * 关闭本复制过程维护的所有远端会话
- * @return void
- */
- public void close() {
- for (RemoteSession session : remoteSessions) {
- session.closeAll();
- }
- }
-
- /**
- * 建立与远端目标结点的连接,产生本地维护的远端会话表
- * @return void
- */
- public void start() {
-
- RemoteNode[] remoteNodes = new RemoteNode[targets.length];
-
- for (int i = 0; i < remoteNodes.length; i++) {
- remoteNodes[i] = new RemoteNode(targets[i].getHostName(), targets[i].getPort());
- }
-
- remoteSessions = remoteSessionManager.newSessions(remoteNodes);
- }
-
-
- /**
- * 数据序列状态传输使用的消息类型
- *
- */
- public enum DataSequenceMsgType {
- CMD_DSINFO_REQUEST((byte) 0x1),
- CMD_DSINFO_RESPONSE((byte) 0x2),
- CMD_GETDSDIFF_REQUEST((byte) 0x3),
- CMD_GETDSDIFF_RESPONSE((byte) 0x4),
- ;
- public final byte CODE;
-
- private DataSequenceMsgType(byte code) {
- this.CODE = code;
- }
-
- public static DataSequenceMsgType valueOf(byte code) {
- for (DataSequenceMsgType msgType : DataSequenceMsgType.values()) {
- if (msgType.CODE == code) {
- return msgType;
- }
- }
- throw new IllegalArgumentException("Unsupported code[" + code + "] of msgType!");
- }
- }
-
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/result/DSDiffRequestResult.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/result/DSDiffRequestResult.java
deleted file mode 100644
index af62bd6c..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/result/DSDiffRequestResult.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package com.jd.blockchain.statetransfer.result;
-
-/**
- * 数据序列差异提供者解码请求者"CMD_GETDSDIFF_REQUEST"消息时得到的结果
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- */
-public class DSDiffRequestResult {
-
- String id;
- long fromHeight;
- long toHeight;
-
- public DSDiffRequestResult(String id ,long fromHeight, long toHeight) {
- this.id = id;
- this.fromHeight = fromHeight;
- this.toHeight = toHeight;
- }
-
- public String getId() {
- return id;
- }
-
- public long getFromHeight() {
- return fromHeight;
- }
-
- public long getToHeight() {
- return toHeight;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public void setFromHeight(long fromHeight) {
- this.fromHeight = fromHeight;
- }
-
- public void setToHeight(long toHeight) {
- this.toHeight = toHeight;
- }
-
-}
diff --git a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/result/DSInfoResponseResult.java b/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/result/DSInfoResponseResult.java
deleted file mode 100644
index 7f6d48cc..00000000
--- a/source/state-transfer/src/main/java/com/jd/blockchain/statetransfer/result/DSInfoResponseResult.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package com.jd.blockchain.statetransfer.result;
-
-import com.jd.blockchain.stp.communication.node.RemoteNode;
-
-/**
- * 数据序列差异请求者解码提供者"CMD_DSINFO_RESPONSE"消息时得到的结果
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- */
-public class DSInfoResponseResult {
-
- long maxHeight;
- RemoteNode maxHeightRemoteNode;
-
- public DSInfoResponseResult(long maxHeight, RemoteNode maxHeightRemoteNode) {
- this.maxHeight = maxHeight;
- this.maxHeightRemoteNode = maxHeightRemoteNode;
- }
-
- public long getMaxHeight() {
- return maxHeight;
- }
-
- public RemoteNode getMaxHeightRemoteNode() {
- return maxHeightRemoteNode;
- }
-
- public void setMaxHeight(long maxHeight) {
- this.maxHeight = maxHeight;
- }
-
- public void setMaxHeightRemoteNode(RemoteNode maxHeightRemoteNode) {
- this.maxHeightRemoteNode = maxHeightRemoteNode;
- }
-
-}
diff --git a/source/state-transfer/src/test/java/test/com/jd/blockchain/statetransfer/StateTransferLayerTest.java b/source/state-transfer/src/test/java/test/com/jd/blockchain/statetransfer/StateTransferLayerTest.java
deleted file mode 100644
index 5741262e..00000000
--- a/source/state-transfer/src/test/java/test/com/jd/blockchain/statetransfer/StateTransferLayerTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-package test.com.jd.blockchain.statetransfer;
-
-import com.jd.blockchain.statetransfer.DataSequence;
-import com.jd.blockchain.statetransfer.DataSequenceElement;
-import com.jd.blockchain.statetransfer.DataSequenceInfo;
-import com.jd.blockchain.statetransfer.callback.DataSequenceReaderImpl;
-import com.jd.blockchain.statetransfer.callback.DataSequenceWriterImpl;
-import com.jd.blockchain.statetransfer.process.DSProcessManager;
-import com.jd.blockchain.utils.codec.Base58Utils;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.net.InetSocketAddress;
-import java.util.LinkedList;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-/**
- * @author zhangshuang
- * @create 2019/4/18
- * @since 1.0.0
- */
-public class StateTransferLayerTest {
-
- private final int[] listenPorts = new int[]{9000, 9010, 9020, 9030};
-
- private String localIp = "127.0.0.1";
-
- private int DataSequenceNum = 1;
-
- private int nodesNum = 4;
-
- private byte[] idBytes = new byte[20];
-
- private Random rand = new Random();
-
- private String[] dataSequenceIds = new String[DataSequenceNum];
-
- private InetSocketAddress[] remoteNodeIps = new InetSocketAddress[nodesNum];
-
- private final ExecutorService threadPool = Executors.newFixedThreadPool(8);
-
- private static LinkedList dataSequencesPerNode = new LinkedList<>();
-
- // 假定每个数据序列元素里有四条记录数据
- private byte[][] dsElementDatas = new byte[4][];
-
-
- @Before
- public void init() {
-
- // 产生两个唯一的数据序列Id标识
- for (int i = 0; i < DataSequenceNum; i++) {
-
- dataSequenceIds[i] = new String();
- rand.nextBytes(idBytes);
- dataSequenceIds[i] = Base58Utils.encode(idBytes);
- }
-
- // 准备好所有的远端结点,包括监听者
- for (int i = 0; i < nodesNum; i++) {
- remoteNodeIps[i] = new InetSocketAddress(localIp, listenPorts[i]);
- }
-
- // 为数据序列的每个高度准备好内容,为了方便测试,每个高度的内容设置为一致
- for (int i = 0; i < dsElementDatas.length; i++) {
- rand.nextBytes(idBytes);
- dsElementDatas[i] = idBytes;
- }
-
- // 为结点准备数据序列
- for (String id : dataSequenceIds) {
- for (int i = 0; i < remoteNodeIps.length; i++) {
- DataSequence dataSequence = new DataSequence(remoteNodeIps[i], id);
-
- // 为数据序列的0,1,2高度添加内容
- for (int j = 0; j < 3; j++) {
- dataSequence.addElement(new DataSequenceElement(id, j, dsElementDatas));
- }
- dataSequencesPerNode.addLast(dataSequence);
- }
-
- // 把其中一个结点的数据序列与其他结点区别开来
- for (int i = 0; i < dataSequencesPerNode.size(); i++) {
- DataSequence dataSequence = dataSequencesPerNode.get(i);
- if (dataSequence.getAddress().getPort() != listenPorts[0]) {
- // 为数据序列的3,4高度添加内容
- for (int j = 3; j < 5; j++) {
- dataSequence.addElement(new DataSequenceElement(id, j, dsElementDatas));
- }
- }
- }
- }
- }
-
- InetSocketAddress[] getTargetNodesIp(InetSocketAddress listenIp, InetSocketAddress[] remoteNodeIps) {
-
- // 获得除监听结点之外的其他远端结点
- InetSocketAddress[] targets = new InetSocketAddress[remoteNodeIps.length - 1];
- int j = 0;
-
- for (int i = 0; i < remoteNodeIps.length; i++) {
- if ((remoteNodeIps[i].getHostName().equals(listenIp.getHostName())) && (remoteNodeIps[i].getPort() == listenIp.getPort())) {
- continue;
- }
- targets[j++] = new InetSocketAddress(remoteNodeIps[i].getHostName(), remoteNodeIps[i].getPort());
- }
-
- return targets;
-
- }
-
-
- DataSequence findDataSequence(String id, InetSocketAddress listenNodeAddr) {
- for (DataSequence dataSequence : dataSequencesPerNode) {
- if ((dataSequence.getAddress().getPort() == listenNodeAddr.getPort() && (dataSequence.getAddress().getHostName().equals(listenNodeAddr.getHostName()))
- && (dataSequence.getId().equals(id)))) {
- return dataSequence;
- }
- }
- return null;
- }
-
-
- @Test
- public void test() {
-
- CountDownLatch countDownLatch = new CountDownLatch(nodesNum);
-
- for (String id : dataSequenceIds) {
- for (int i = 0; i < nodesNum; i++) {
- InetSocketAddress listenNode = remoteNodeIps[i];
- threadPool.execute(() -> {
- // 创建数据序列处理管理者实例
- DSProcessManager dsProcessManager = new DSProcessManager();
- DataSequence currDataSequence = findDataSequence(id, listenNode);
- DataSequenceInfo dsInfo = currDataSequence.getDSInfo();
- InetSocketAddress[] targets = getTargetNodesIp(listenNode, remoteNodeIps);
- dsProcessManager.startDSProcess(dsInfo, listenNode, targets, new DataSequenceWriterImpl(currDataSequence), new DataSequenceReaderImpl(currDataSequence));
- countDownLatch.countDown();
- });
- }
- }
-
- // 等待数据序列更新完成
- try {
- Thread.sleep(60000);
- countDownLatch.await();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-}
diff --git a/source/storage/storage-redis/pom.xml b/source/storage/storage-redis/pom.xml
index d8ec1035..2e9580d9 100644
--- a/source/storage/storage-redis/pom.xml
+++ b/source/storage/storage-redis/pom.xml
@@ -1,42 +1,46 @@
-
- 4.0.0
-
- com.jd.blockchain
- storage
- 1.0.0.RELEASE
-
- storage-redis
-
-
-
- com.jd.blockchain
- storage-service
- ${project.version}
-
-
- com.jd.blockchain
- utils-common
- ${project.version}
-
-
- org.springframework.boot
- spring-boot
-
-
- org.springframework.boot
- spring-boot-autoconfigure
-
-
- org.springframework.boot
- spring-boot-configuration-processor
- true
-
-
-
- redis.clients
- jedis
-
-
-
+
+ 4.0.0
+
+ com.jd.blockchain
+ storage
+ 1.0.0.RELEASE
+
+ storage-redis
+
+
+
+ com.jd.blockchain
+ storage-service
+ ${project.version}
+
+
+ com.jd.blockchain
+ utils-common
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
+ redis.clients
+ jedis
+
+
+ junit
+ junit
+
+
+
\ No newline at end of file
diff --git a/source/storage/storage-rocksdb/pom.xml b/source/storage/storage-rocksdb/pom.xml
index 806fab58..abce4bbb 100644
--- a/source/storage/storage-rocksdb/pom.xml
+++ b/source/storage/storage-rocksdb/pom.xml
@@ -31,6 +31,10 @@
org.apache.commons
commons-collections4
+
+ junit
+ junit
+