Browse Source

Merge commit 'fa99325a93a38be04cd80a1db7c0077d6dbfc374' into feature/crypto-spi

tags/1.0.0
zhanglin33 5 years ago
parent
commit
6d94f7a3d0
93 changed files with 1729 additions and 1865 deletions
  1. +2
    -0
      source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java
  2. +25
    -6
      source/base/src/main/java/com/jd/blockchain/provider/ProviderManager.java
  3. +1
    -0
      source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java
  4. +0
    -10
      source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/StringUtils.java
  5. +3
    -3
      source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties
  6. +0
    -80
      source/contract/contract-tools/pom.xml
  7. +38
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/Crypto.java
  8. +8
    -2
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithm.java
  9. +13
    -25
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithmDefinition.java
  10. +17
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoProvider.java
  11. +24
    -0
      source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoProviderInfo.java
  12. +0
    -67
      source/deployment/deployment-peer/src/main/resources/config/init/ledger-init.conf
  13. +97
    -0
      source/deployment/deployment-peer/src/main/resources/config/init/ledger.init
  14. +0
    -8
      source/deployment/deployment-peer/src/main/resources/config/init/local.conf
  15. +1
    -19
      source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceHandler.java
  16. +7
    -0
      source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java
  17. +8
    -0
      source/gateway/src/main/java/com/jd/blockchain/gateway/web/GatewayWebServerConfigurer.java
  18. +2
    -2
      source/gateway/src/main/resources/gateway.conf
  19. +53
    -2
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java
  20. +3
    -0
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java
  21. +77
    -21
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java
  22. +62
    -0
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java
  23. +5
    -0
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java
  24. +14
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/AccountSetTest.java
  25. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java
  26. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerAdminAccountTest.java
  27. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java
  28. +12
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitOperationTest.java
  29. +15
    -2
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitSettingSerializeTest.java
  30. +16
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java
  31. +27
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java
  32. +13
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerTestUtils.java
  33. +26
    -0
      source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/MerkleDataSetTest.java
  34. +48
    -26
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractEventSendOperation.java
  35. +0
    -12
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoProviderInfo.java
  36. +13
    -1
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoSetting.java
  37. +26
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataVO.java
  38. +18
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVInfoVO.java
  39. +1
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNode.java
  40. +21
    -21
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContent.java
  41. +36
    -36
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContentBody.java
  42. +2
    -0
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java
  43. +50
    -40
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractEventSendOpTemplate.java
  44. +4
    -3
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractEventSendOperationBuilderImpl.java
  45. +39
    -8
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java
  46. +2
    -2
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOpTemplate.java
  47. +93
    -93
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java
  48. +91
    -91
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxContentBlob.java
  49. +0
    -5
      source/peer/pom.xml
  50. +0
    -2
      source/peer/src/main/java/com/jd/blockchain/peer/LedgerBindingConfigAware.java
  51. +72
    -6
      source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java
  52. +15
    -156
      source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java
  53. +14
    -8
      source/peer/src/main/java/com/jd/blockchain/peer/web/PeerTimeTasks.java
  54. +3
    -20
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/LedgerInitSettings.java
  55. +5
    -0
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java
  56. +6
    -1
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java
  57. +0
    -1
      source/test/pom.xml
  58. +4
    -6
      source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/PresetAnswerPrompter.java
  59. +12
    -13
      source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/consensus/ConsensusTest.java
  60. +5
    -5
      source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/GlobalPerformanceTest.java
  61. +12
    -22
      source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerInitializeTest.java
  62. +13
    -14
      source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerInitializeWebTest.java
  63. +3
    -6
      source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java
  64. +23
    -20
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBaseTest.java
  65. +16
    -18
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest2.java
  66. +14
    -14
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestDataAccount.java
  67. +22
    -17
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitPropertiesTest.java
  68. +22
    -21
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeTest.java
  69. +11
    -13
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeWeb4Nodes.java
  70. +7
    -9
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeWeb4SingleStepsTest.java
  71. +10
    -15
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/ledger/LedgerBlockGeneratingTest.java
  72. +1
    -0
      source/test/test-integration/src/test/resources/keys/parti2.pub
  73. +13
    -1
      source/test/test-integration/src/test/resources/ledger.init
  74. +10
    -0
      source/test/test-integration/src/test/resources/ledger_init_test.init
  75. +11
    -0
      source/test/test-integration/src/test/resources/ledger_init_test_web2.init
  76. +0
    -36
      source/test/test-stp-community/pom.xml
  77. +0
    -37
      source/test/test-stp-community/src/main/java/com/jd/blockchain/stp/commucation/MyMessageExecutor.java
  78. +0
    -75
      source/test/test-stp-community/src/main/java/com/jd/blockchain/stp/commucation/StpReceiversBoot.java
  79. +0
    -43
      source/test/test-stp-community/src/test/java/com/jd/blockchain/StpReceiversBootTest.java
  80. +0
    -96
      source/test/test-stp-community/src/test/java/com/jd/blockchain/StpSenderTest.java
  81. +0
    -206
      source/test/test-stp-community/src/test/java/com/jd/blockchain/StpTest.java
  82. +47
    -61
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitCommand.java
  83. +5
    -23
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProcess.java
  84. +85
    -122
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java
  85. +7
    -57
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LocalConfig.java
  86. +22
    -0
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/Prompter.java
  87. +69
    -33
      source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java
  88. +0
    -7
      source/tools/tools-initializer/src/main/resources/local.conf
  89. +1
    -9
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/ArrayUtils.java
  90. +38
    -50
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/PropertiesUtils.java
  91. +24
    -0
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/StringUtils.java
  92. +5
    -5
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/concurrent/InvocationResult.java
  93. +50
    -32
      source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/FileUtils.java

+ 2
- 0
source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java View File

@@ -68,6 +68,8 @@ public interface DataCodes {
// public static final int METADATA_PARTICIPANT_INFO = 0x640; // public static final int METADATA_PARTICIPANT_INFO = 0x640;


public static final int METADATA_CRYPTO_SETTING = 0x642; public static final int METADATA_CRYPTO_SETTING = 0x642;
public static final int METADATA_CRYPTO_SETTING_PROVIDER = 0x643;


// public static final int ACCOUNT = 0x700; // public static final int ACCOUNT = 0x700;




+ 25
- 6
source/base/src/main/java/com/jd/blockchain/provider/ProviderManager.java View File

@@ -4,6 +4,7 @@ import java.security.AccessControlContext;
import java.security.AccessController; import java.security.AccessController;
import java.security.PrivilegedAction; import java.security.PrivilegedAction;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
@@ -48,32 +49,45 @@ public final class ProviderManager {
* @return * @return
*/ */
public <S> S getService(Class<S> serviceClazz, String providerName) { public <S> S getService(Class<S> serviceClazz, String providerName) {
NamedProviders<S> providers = getServiceProvider(serviceClazz);
NamedProviders<S> providers = getNamedProviders(serviceClazz);
return providers.getService(providerName); return providers.getService(providerName);
} }
public <S> Provider<S> getProvider(Class<S> serviceClazz, String providerName) {
@SuppressWarnings("unchecked")
NamedProviders<S> providers = (NamedProviders<S>) serviceProviders.get(serviceClazz);
if (providers == null) {
return null;
}
return providers.getProvider(providerName);
}


public <S> Collection<Provider<S>> getAllProviders(Class<S> serviceClazz) { public <S> Collection<Provider<S>> getAllProviders(Class<S> serviceClazz) {
NamedProviders<S> providers = getServiceProvider(serviceClazz);
@SuppressWarnings("unchecked")
NamedProviders<S> providers = (NamedProviders<S>) serviceProviders.get(serviceClazz);
if (providers == null) {
return Collections.emptyList();
}
return providers.getProviders(); return providers.getProviders();
} }


public <S> S installProvider(Class<S> serviceClazz, String providerFullName) { public <S> S installProvider(Class<S> serviceClazz, String providerFullName) {
NamedProviders<S> providers = getServiceProvider(serviceClazz);
NamedProviders<S> providers = getNamedProviders(serviceClazz);
return providers.install(providerFullName); return providers.install(providerFullName);
} }


public <S> S installProvider(Class<S> service, String providerFullName, ClassLoader classLoader) { public <S> S installProvider(Class<S> service, String providerFullName, ClassLoader classLoader) {
NamedProviders<S> providers = getServiceProvider(service);
NamedProviders<S> providers = getNamedProviders(service);
return providers.install(providerFullName, classLoader); return providers.install(providerFullName, classLoader);
} }


public <S> void installAllProviders(Class<S> serviceClazz, ClassLoader classLoader) { public <S> void installAllProviders(Class<S> serviceClazz, ClassLoader classLoader) {
NamedProviders<S> providers = getServiceProvider(serviceClazz);
NamedProviders<S> providers = getNamedProviders(serviceClazz);
providers.installAll(classLoader); providers.installAll(classLoader);
} }


@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <S> NamedProviders<S> getServiceProvider(Class<S> serviceClazz) {
private <S> NamedProviders<S> getNamedProviders(Class<S> serviceClazz) {
NamedProviders<S> providers = (NamedProviders<S>) serviceProviders.get(serviceClazz); NamedProviders<S> providers = (NamedProviders<S>) serviceProviders.get(serviceClazz);
if (providers == null) { if (providers == null) {
synchronized (mutex) { synchronized (mutex) {
@@ -189,6 +203,11 @@ public final class ProviderManager {
public Collection<Provider<S>> getProviders() { public Collection<Provider<S>> getProviders() {
return namedProviders.values(); return namedProviders.values();
} }

public Provider<S> getProvider(String providerFullName) {
return namedProviders.get(providerFullName);
}


public S getService(String name) { public S getService(String name) {
String fullName = shortNames.get(name); String fullName = shortNames.get(name);


+ 1
- 0
source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployMojo.java View File

@@ -5,6 +5,7 @@ import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.tools.keygen.KeyGenCommand; import com.jd.blockchain.tools.keygen.KeyGenCommand;
import com.jd.blockchain.utils.StringUtils;
import com.jd.blockchain.utils.codec.Base58Utils; import com.jd.blockchain.utils.codec.Base58Utils;
import com.jd.blockchain.utils.io.FileUtils; import com.jd.blockchain.utils.io.FileUtils;
import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.AbstractMojo;


+ 0
- 10
source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/StringUtils.java View File

@@ -1,10 +0,0 @@
package com.jd.blockchain;
/**
* @Author zhaogw
* @Date 2018/11/26 20:46
*/
public abstract class StringUtils {
public static boolean isEmpty(Object str) {
return str == null || "".equals(str);
}
}

+ 3
- 3
source/contract/contract-maven-plugin/src/main/resources/sys-contract.properties View File

@@ -1,9 +1,9 @@
#项目源文件存放的位置;
#PROJECT_BASE_DIR
PROJECT_BASE_DIR=E:\\gitCode\\block\\prototype\\ PROJECT_BASE_DIR=E:\\gitCode\\block\\prototype\\
#合同使用的类库存放的位置,可能不在项目中,故采用全新的地址;
#LEDGER_BASE_CLASS_PATH
LEDGER_BASE_CLASS_PATH=E:\\gitCode\\block\\prototype\\libs\\ LEDGER_BASE_CLASS_PATH=E:\\gitCode\\block\\prototype\\libs\\


#为了测试,临时添加的变量;
#deploy and execute the contract;
cParam=com.jd.blockchain.contract.AssetContract3 cParam=com.jd.blockchain.contract.AssetContract3
sParam=E:\\gitCode\\block\\prototype\\source\\sdk\\contract-sample\\src\\main\\java\\ sParam=E:\\gitCode\\block\\prototype\\source\\sdk\\contract-sample\\src\\main\\java\\
eParam=utf-8 eParam=utf-8


+ 0
- 80
source/contract/contract-tools/pom.xml View File

@@ -1,80 +0,0 @@
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.jd.blockchain</groupId>
<artifactId>contract</artifactId>
<version>0.9.0-SNAPSHOT</version>
</parent>
<artifactId>contract-tools</artifactId>

<dependencies>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>contract-compiler</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>contract-jar</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.5</version>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>

<!--<build>-->
<!--<plugins>-->
<!--<plugin>-->
<!--<groupId>org.apache.maven.plugins</groupId>-->
<!--<artifactId>maven-compiler-plugin</artifactId>-->
<!--<version>3.1</version>-->
<!--<configuration>-->
<!--<source>1.8</source>-->
<!--<target>1.8</target>-->
<!--<encoding>UTF-8</encoding>-->
<!--<compilerArgs>-->
<!--&lt;!&ndash;<arg>-verbose</arg>&ndash;&gt;-->
<!--&lt;!&ndash;<arg>-Xlint:unchecked</arg>&ndash;&gt;-->
<!--&lt;!&ndash;<arg>-Xlint:deprecation</arg>&ndash;&gt;-->
<!--&lt;!&ndash;<arg>-bootclasspath</arg>&ndash;&gt;-->
<!--&lt;!&ndash;<arg>${env.JAVA_HOME}/jre/lib/rt.jar</arg>&ndash;&gt;-->
<!--<arg>-extdirs</arg>-->
<!--<arg>${project.basedir}/../contract/contract-libs;$JAVA_HOME/jre/lib/ext</arg>-->
<!--</compilerArgs>-->
<!--</configuration>-->
<!--</plugin>-->
<!--</plugins>-->
<!--</build>-->
</project>

+ 38
- 0
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/Crypto.java View File

@@ -106,6 +106,44 @@ public final class Crypto {
private Crypto() { private Crypto() {
} }


public static CryptoProvider[] getProviders() {
Collection<Provider<CryptoService>> providers = pm.getAllProviders(CryptoService.class);
CryptoProvider[] infos = new CryptoProvider[providers.size()];

int i = 0;
for (Provider<CryptoService> pd : providers) {
CryptoProviderInfo info = getProviderInfo(pd);
infos[i] = info;
}

return infos;
}

private static CryptoProviderInfo getProviderInfo(Provider<CryptoService> pd) {
Collection<CryptoFunction> functions = pd.getService().getFunctions();
CryptoAlgorithm[] algorithms = new CryptoAlgorithm[functions.size()];
int i = 0;
for (CryptoFunction function : functions) {
algorithms[i] = function.getAlgorithm();
i++;
}
return new CryptoProviderInfo(pd.getFullName(), algorithms);
}

/**
* 返回指定名称的密码服务提供者;如果不存在,则返回 null ;
*
* @param providerFullName
* @return
*/
public static CryptoProvider getProvider(String providerFullName) {
Provider<CryptoService> pd = pm.getProvider(CryptoService.class, providerFullName);
if (pd == null) {
throw new CryptoException("Crypto service provider named [" + providerFullName + "] does not exist!");
}
return getProviderInfo(pd);
}

public static Collection<CryptoAlgorithm> getAllAlgorithms() { public static Collection<CryptoAlgorithm> getAllAlgorithms() {
return algorithms.values(); return algorithms.values();
} }


+ 8
- 2
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithm.java View File

@@ -9,7 +9,7 @@ import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.utils.io.BytesUtils; import com.jd.blockchain.utils.io.BytesUtils;


//@DataContract(code = DataCodes.CRYPTO_ALGORITHM)
@DataContract(code = DataCodes.CRYPTO_ALGORITHM)
public interface CryptoAlgorithm { public interface CryptoAlgorithm {


/** /**
@@ -63,7 +63,7 @@ public interface CryptoAlgorithm {
* {@link #EXT_ALGORITHM}) 5 种); 接下来4位标识密钥类型(包括:{@link #SYMMETRIC_KEY}, * {@link #EXT_ALGORITHM}) 5 种); 接下来4位标识密钥类型(包括:{@link #SYMMETRIC_KEY},
* {@link #ASYMMETRIC_KEY}); 最后8位是算法唯一ID; * {@link #ASYMMETRIC_KEY}); 最后8位是算法唯一ID;
*/ */
// @DataField(primitiveType = PrimitiveType.INT16, order = 0)
@DataField(order = 0, primitiveType = PrimitiveType.INT16)
short code(); short code();


/** /**
@@ -75,7 +75,13 @@ public interface CryptoAlgorithm {
* *
* @return * @return
*/ */
@DataField(order = 1, primitiveType = PrimitiveType.TEXT)
String name(); String name();

public static String getString(CryptoAlgorithm algorithm) {
return String.format("%s[%s]", algorithm.name(), (algorithm.code() & 0xFFFF));
}


/** /**
* *


+ 13
- 25
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoAlgorithmDefinition.java View File

@@ -23,16 +23,14 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {


@Override @Override
public String toString() { public String toString() {
return name + "[" + (code & 0xFFFF) + "]";
return CryptoAlgorithm.getString(this);
} }


/** /**
* 声明一项哈希算法; * 声明一项哈希算法;
* *
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return * @return
*/ */
public static CryptoAlgorithm defineHash(String name, byte uid) { public static CryptoAlgorithm defineHash(String name, byte uid) {
@@ -43,10 +41,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/** /**
* 声明一项非对称密码算法; * 声明一项非对称密码算法;
* *
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return * @return
*/ */
public static CryptoAlgorithm defineSignature(String name, boolean encryptable, byte uid) { public static CryptoAlgorithm defineSignature(String name, boolean encryptable, byte uid) {
@@ -62,10 +58,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/** /**
* 声明一项非对称加密算法; * 声明一项非对称加密算法;
* *
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return * @return
*/ */
public static CryptoAlgorithm defineAsymmetricEncryption(String name, byte uid) { public static CryptoAlgorithm defineAsymmetricEncryption(String name, byte uid) {
@@ -76,10 +70,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/** /**
* 声明一项对称密码算法; * 声明一项对称密码算法;
* *
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return * @return
*/ */
public static CryptoAlgorithm defineSymmetricEncryption(String name, byte uid) { public static CryptoAlgorithm defineSymmetricEncryption(String name, byte uid) {
@@ -90,10 +82,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/** /**
* 声明一项随机数算法; * 声明一项随机数算法;
* *
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return * @return
*/ */
public static CryptoAlgorithm defineRandom(String name, byte uid) { public static CryptoAlgorithm defineRandom(String name, byte uid) {
@@ -104,10 +94,8 @@ public final class CryptoAlgorithmDefinition implements CryptoAlgorithm {
/** /**
* 声明一项扩展的密码算法; * 声明一项扩展的密码算法;
* *
* @param name
* 算法名称;
* @param uid
* 算法ID;需要在同类算法中保持唯一性;
* @param name 算法名称;
* @param uid 算法ID;需要在同类算法中保持唯一性;
* @return * @return
*/ */
public static CryptoAlgorithm definExt(String name, byte uid) { public static CryptoAlgorithm definExt(String name, byte uid) {


+ 17
- 0
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoProvider.java View File

@@ -0,0 +1,17 @@
package com.jd.blockchain.crypto;

import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;

@DataContract(code = DataCodes.METADATA_CRYPTO_SETTING_PROVIDER)
public interface CryptoProvider {

@DataField(order = 0, primitiveType = PrimitiveType.TEXT)
String getName();

@DataField(order = 1, list = true, refContract = true)
CryptoAlgorithm[] getAlgorithms();

}

+ 24
- 0
source/crypto/crypto-framework/src/main/java/com/jd/blockchain/crypto/CryptoProviderInfo.java View File

@@ -0,0 +1,24 @@
package com.jd.blockchain.crypto;

class CryptoProviderInfo implements CryptoProvider {

private String name;

private CryptoAlgorithm[] algorithms;

public CryptoProviderInfo(String name, CryptoAlgorithm[] algorithms) {
this.name = name;
this.algorithms = algorithms;
}

@Override
public String getName() {
return name;
}

@Override
public CryptoAlgorithm[] getAlgorithms() {
return algorithms.clone();
}

}

+ 0
- 67
source/deployment/deployment-peer/src/main/resources/config/init/ledger-init.conf View File

@@ -1,67 +0,0 @@
#账本的种子;一段16进制字符,最长可以包含64个字符;可以用字符“-”分隔,以便更容易读取;
#不同的账本,种子不能相同
ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe

#账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途;
#ledger.name=

#参与方的个数,后续以cons_parti.id分别标识每一个参与方的配置;
cons_parti.count=4


#第0个参与方的名称(不同参与方名称不能相同)
cons_parti.0.name=
#第0个参与方的公钥文件路径
cons_parti.0.pubkey-path=
#第0个参与方的公钥内容(由keygen工具生成),此参数优先于 pubkey-path 参数
cons_parti.0.pubkey=
#第0个参与方的账本初始服务的主机
cons_parti.0.initializer.host=127.0.0.1
#第0个参与方的账本初始服务的端口
cons_parti.0.initializer.port=17000
#第0个参与方的账本初始服务是否开启安全连接
cons_parti.0.initializer.secure=false


#第1个参与方的名称
cons_parti.1.name=
#第1个参与方的公钥文件路径
cons_parti.1.pubkey-path=
#第1个参与方的公钥内容(由keygen工具生成),此参数优先于 pubkey-path 参数
cons_parti.1.pubkey=
#第1个参与方的账本初始服务的主机
cons_parti.1.initializer.host=127.0.0.1
#第1个参与方的账本初始服务的端口
cons_parti.1.initializer.port=17010
#第1个参与方的账本初始服务是否开启安全连接
cons_parti.1.initializer.secure=false


#第2个参与方的名称
cons_parti.2.name=
#第2个参与方的公钥文件路径
cons_parti.2.pubkey-path=
#第2个参与方的公钥内容(由keygen工具生成),此参数优先于 pubkey-path 参数
cons_parti.2.pubkey=
#第2个参与方的账本初始服务的主机
cons_parti.2.initializer.host=127.0.0.1
#第2个参与方的账本初始服务的端口
cons_parti.2.initializer.port=17020
#第2个参与方的账本初始服务是否开启安全连接
cons_parti.2.initializer.secure=false


#第3个参与方的名称
cons_parti.3.name=
#第3个参与方的公钥文件路径
cons_parti.3.pubkey-path=
#第3个参与方的公钥内容(由keygen工具生成),此参数优先于 pubkey-path 参数
cons_parti.3.pubkey=
#第3个参与方的账本初始服务的主机
cons_parti.3.initializer.host=127.0.0.1
#第3个参与方的账本初始服务的端口
cons_parti.3.initializer.port=17030
#第3个参与方的账本初始服务是否开启安全连接
cons_parti.3.initializer.secure=false



+ 97
- 0
source/deployment/deployment-peer/src/main/resources/config/init/ledger.init View File

@@ -0,0 +1,97 @@

#账本的种子;一段16进制字符,最长可以包含64个字符;可以用字符“-”分隔,以便更容易读取;
ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe

#账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途;
ledger.name=


#共识服务提供者;必须;
consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider

#共识服务的参数配置;必须;
consensus.conf=classpath:bftsmart.config

#密码服务提供者列表,以英文逗点“,”分隔;必须;
crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService, \
com.jd.blockchain.crypto.service.sm.SMCryptoService


#参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置;
cons_parti.count=4

#第0个参与方的名称;
cons_parti.0.name=jd.com
#第0个参与方的公钥文件路径;
cons_parti.0.pubkey-path=keys/jd-com.pub
#第0个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.0.pubkey=3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9
#第0个参与方的共识服务的主机地址;
cons_parti.0.consensus.host=127.0.0.1
#第0个参与方的共识服务的端口;
cons_parti.0.consensus.port=8900
#第0个参与方的共识服务是否开启安全连接;
cons_parti.0.consensus.secure=true
#第0个参与方的账本初始服务的主机;
cons_parti.0.initializer.host=127.0.0.1
#第0个参与方的账本初始服务的端口;
cons_parti.0.initializer.port=8800
#第0个参与方的账本初始服务是否开启安全连接;
cons_parti.0.initializer.secure=true

#第1个参与方的名称;
cons_parti.1.name=at.com
#第1个参与方的公钥文件路径;
cons_parti.1.pubkey-path=keys/at-com.pub
#第1个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.1.pubkey=3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX
#第1个参与方的共识服务的主机地址;
cons_parti.1.consensus.host=127.0.0.1
#第1个参与方的共识服务的端口;
cons_parti.1.consensus.port=8910
#第1个参与方的共识服务是否开启安全连接;
cons_parti.1.consensus.secure=false
#第1个参与方的账本初始服务的主机;
cons_parti.1.initializer.host=127.0.0.1
#第1个参与方的账本初始服务的端口;
cons_parti.1.initializer.port=8810
#第1个参与方的账本初始服务是否开启安全连接;
cons_parti.1.initializer.secure=false

#第2个参与方的名称;
cons_parti.2.name=bt.com
#第2个参与方的公钥文件路径;
cons_parti.2.pubkey-path=classpath:keys/parti2.pub
#第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.2.pubkey=
#第2个参与方的共识服务的主机地址;
cons_parti.2.consensus.host=127.0.0.1
#第2个参与方的共识服务的端口;
cons_parti.2.consensus.port=8920
#第2个参与方的共识服务是否开启安全连接;
cons_parti.2.consensus.secure=false
#第2个参与方的账本初始服务的主机;
cons_parti.2.initializer.host=127.0.0.1
#第2个参与方的账本初始服务的端口;
cons_parti.2.initializer.port=8820
#第2个参与方的账本初始服务是否开启安全连接;
cons_parti.2.initializer.secure=true

#第3个参与方的名称;
cons_parti.3.name=xt.com
#第3个参与方的公钥文件路径;
cons_parti.3.pubkey-path=keys/xt-com.pub
#第3个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.3.pubkey=3snPdw7i7PifPuRX7fu3jBjsb3rJRfDe9GtbDfvFJaJ4V4hHXQfhwk
#第3个参与方的共识服务的主机地址;
cons_parti.3.consensus.host=127.0.0.1
#第3个参与方的共识服务的端口;
cons_parti.3.consensus.port=8930
#第3个参与方的共识服务是否开启安全连接;
cons_parti.3.consensus.secure=false
#第3个参与方的账本初始服务的主机;
cons_parti.3.initializer.host=127.0.0.1
#第3个参与方的账本初始服务的端口;
cons_parti.3.initializer.port=8830
#第3个参与方的账本初始服务是否开启安全连接;
cons_parti.3.initializer.secure=false

+ 0
- 8
source/deployment/deployment-peer/src/main/resources/config/init/local.conf View File

@@ -22,11 +22,3 @@ ledger.db.uri=
#账本数据库的连接口令 #账本数据库的连接口令
ledger.db.pwd= ledger.db.pwd=


#共识配置文件路径
#推荐使用绝对路径,相对路径以当前文件(local.conf)所在目录为基准
consensus.conf=bftsmart.config

#共识Providers配置
#BftSmart共识Provider:com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider
#简单消息共识Provider:com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider
consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider

+ 1
- 19
source/gateway/src/main/java/com/jd/blockchain/gateway/service/GatewayQueryServiceHandler.java View File

@@ -81,7 +81,7 @@ public class GatewayQueryServiceHandler implements GatewayQueryService {
ledgerInitSettings.setSeed(initSeed(ledgerMetadata.getSeed())); ledgerInitSettings.setSeed(initSeed(ledgerMetadata.getSeed()));


// 设置共识协议 // 设置共识协议
ledgerInitSettings.setConsensusProtocol(consensusProtocol(ledgerMetadata.getSetting().getConsensusProvider()));
ledgerInitSettings.setConsensusProtocol(ledgerMetadata.getSetting().getConsensusProvider());


return ledgerInitSettings; return ledgerInitSettings;
} }
@@ -110,24 +110,6 @@ public class GatewayQueryServiceHandler implements GatewayQueryService {
return seed.toString(); return seed.toString();
} }


/**
* 生成共识协议
*
* @param consensusProvider
* 共识协议提提供者
* @return
*/
private int consensusProtocol(String consensusProvider) {

if (consensusProvider.equals(BftsmartConsensusProvider.NAME)) {
return LedgerInitSettings.CONSENSUS_PROTOCOL.BFTSMART.code();
} else if (consensusProvider.equals(MsgQueueConsensusProvider.NAME)) {
return LedgerInitSettings.CONSENSUS_PROTOCOL.MSGQUEUE.code();
}

return LedgerInitSettings.CONSENSUS_PROTOCOL.UNKNOWN.code();
}

/** /**
* 初始化共识配置 * 初始化共识配置
* *


+ 7
- 0
source/gateway/src/main/java/com/jd/blockchain/gateway/web/BlockBrowserController.java View File

@@ -239,6 +239,13 @@ public class BlockBrowserController implements BlockchainExtendQueryService {
return peerService.getQueryService().getDataEntries(ledgerHash, address, keys); return peerService.getQueryService().getDataEntries(ledgerHash, address, keys);
} }


@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/{address}/entries-version")
public KVDataEntry[] getDataEntries(@PathVariable("ledgerHash") HashDigest ledgerHash,
@PathVariable("address") String address,
@RequestBody KVInfoVO kvInfoVO) {
return peerService.getQueryService().getDataEntries(ledgerHash, address, kvInfoVO);
}

@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries") @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
@Override @Override
public KVDataEntry[] getDataEntries(@PathVariable("ledgerHash") HashDigest ledgerHash, public KVDataEntry[] getDataEntries(@PathVariable("ledgerHash") HashDigest ledgerHash,


+ 8
- 0
source/gateway/src/main/java/com/jd/blockchain/gateway/web/GatewayWebServerConfigurer.java View File

@@ -2,6 +2,13 @@ package com.jd.blockchain.gateway.web;


import java.util.List; import java.util.List;


import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.consensus.ClientIdentification;
import com.jd.blockchain.consensus.ClientIdentifications;
import com.jd.blockchain.consensus.action.ActionRequest;
import com.jd.blockchain.consensus.action.ActionResponse;
import com.jd.blockchain.consensus.bftsmart.BftsmartNodeSettings;
import com.jd.blockchain.ledger.*;
import com.jd.blockchain.web.serializes.ByteArrayObjectUtil; import com.jd.blockchain.web.serializes.ByteArrayObjectUtil;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry; import org.springframework.format.FormatterRegistry;
@@ -27,6 +34,7 @@ public class GatewayWebServerConfigurer implements WebMvcConfigurer {
static { static {
JSONSerializeUtils.disableCircularReferenceDetect(); JSONSerializeUtils.disableCircularReferenceDetect();
JSONSerializeUtils.configStringSerializer(ByteArray.class); JSONSerializeUtils.configStringSerializer(ByteArray.class);
DataContractRegistry.register(BftsmartNodeSettings.class);
} }






+ 2
- 2
source/gateway/src/main/resources/gateway.conf View File

@@ -21,10 +21,10 @@ peer.providers=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider
data.retrieval.url=http://127.0.0.1:10001 data.retrieval.url=http://127.0.0.1:10001
#默认公钥的内容(Base58编码数据); #默认公钥的内容(Base58编码数据);
keys.default.pubkey=3snPdw7i7PapsDoW185c3kfK6p8s6SwiJAdEUzgnfeuUox12nxgzXu
keys.default.pubkey=3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9
#默认私钥的路径;在 pk-path 和 pk 之间必须设置其一; #默认私钥的路径;在 pk-path 和 pk 之间必须设置其一;
keys.default.privkey-path= keys.default.privkey-path=
#默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一; #默认私钥的内容(加密的Base58编码数据);在 pk-path 和 pk 之间必须设置其一;
keys.default.privkey=177gjyoEUhdD1NkQSxBVvfSyovMd1ha5H46zsb9kyErLNBuQkLRAf2ea6CNjStjCFJQN8S1
keys.default.privkey=177gjzHTznYdPgWqZrH43W3yp37onm74wYXT4v9FukpCHBrhRysBBZh7Pzdo5AMRyQGJD7x
#默认私钥的解码密码; #默认私钥的解码密码;
keys.default.privkey-password=DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY keys.default.privkey-password=DYu3G8aGTMBW1WrTw76zxQJQU4DHLw9MLyy7peG4LKkY

+ 53
- 2
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/CryptoConfig.java View File

@@ -1,22 +1,37 @@
package com.jd.blockchain.ledger.core; package com.jd.blockchain.ledger.core;


import java.util.HashMap;

import com.jd.blockchain.crypto.CryptoAlgorithm; import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.ledger.CryptoSetting; import com.jd.blockchain.ledger.CryptoSetting;


public class CryptoConfig implements CryptoSetting { public class CryptoConfig implements CryptoSetting {


private CryptoProvider[] cryptoProviders;

private short hashAlgorithm; private short hashAlgorithm;


private boolean autoVerifyHash; private boolean autoVerifyHash;


HashMap<String, CryptoProvider> providers;
HashMap<String, CryptoAlgorithm> nameAlgorithms;
HashMap<Short, CryptoAlgorithm> codeAlgorithms;

public CryptoConfig() { public CryptoConfig() {
} }


public CryptoConfig(CryptoSetting setting) { public CryptoConfig(CryptoSetting setting) {
this.hashAlgorithm = setting.getHashAlgorithm();
setSupportedProviders(setting.getSupportedProviders());
setHashAlgorithm(setting.getHashAlgorithm());
this.autoVerifyHash = setting.getAutoVerifyHash(); this.autoVerifyHash = setting.getAutoVerifyHash();
} }


@Override
public CryptoProvider[] getSupportedProviders() {
return cryptoProviders == null ? null : cryptoProviders.clone();
}

@Override @Override
public short getHashAlgorithm() { public short getHashAlgorithm() {
return hashAlgorithm; return hashAlgorithm;
@@ -27,11 +42,47 @@ public class CryptoConfig implements CryptoSetting {
return autoVerifyHash; return autoVerifyHash;
} }


public void setSupportedProviders(CryptoProvider[] supportedProviders) {
HashMap<String, CryptoProvider> providers = new HashMap<String, CryptoProvider>();
HashMap<String, CryptoAlgorithm> nameAlgorithms = new HashMap<String, CryptoAlgorithm>();
HashMap<Short, CryptoAlgorithm> codeAlgorithms = new HashMap<Short, CryptoAlgorithm>();
if (supportedProviders != null) {
// 检查是否存在重复的提供者以及算法;
for (CryptoProvider cryptoProvider : supportedProviders) {
if (providers.containsKey(cryptoProvider.getName())) {
throw new LedgerException("Duplicate crypto providers [" + cryptoProvider.getName() + "]!");
}
CryptoAlgorithm[] algorithms = cryptoProvider.getAlgorithms();
for (CryptoAlgorithm alg : algorithms) {
if (nameAlgorithms.containsKey(alg.name())) {
throw new LedgerException("Duplicate crypto algorithms [" + alg.toString() + "] from provider "
+ cryptoProvider.getName() + "!");
}
if (codeAlgorithms.containsKey(alg.code())) {
throw new LedgerException("Duplicate crypto algorithms [" + alg.toString() + "] from provider"
+ cryptoProvider.getName() + "!");
}
nameAlgorithms.put(alg.name(), alg);
codeAlgorithms.put(alg.code(), alg);
}
providers.put(cryptoProvider.getName(), cryptoProvider);
}
}
this.providers = providers;
this.nameAlgorithms = nameAlgorithms;
this.codeAlgorithms = codeAlgorithms;

this.cryptoProviders = supportedProviders;
}

public void setHashAlgorithm(CryptoAlgorithm hashAlgorithm) { public void setHashAlgorithm(CryptoAlgorithm hashAlgorithm) {
this.hashAlgorithm = hashAlgorithm.code();
setHashAlgorithm(hashAlgorithm.code());
} }


public void setHashAlgorithm(short hashAlgorithm) { public void setHashAlgorithm(short hashAlgorithm) {
if (codeAlgorithms == null || !codeAlgorithms.containsKey(hashAlgorithm)) {
throw new LedgerException("The specified algorithm[" + hashAlgorithm + "] has no provider!");
}
this.hashAlgorithm = hashAlgorithm; this.hashAlgorithm = hashAlgorithm;
} }




+ 3
- 0
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DataAccount.java View File

@@ -157,6 +157,9 @@ public class DataAccount implements AccountHeader, MerkleProvable {
* @return return total count; * @return return total count;
*/ */
public long getDataEntriesTotalCount() { public long getDataEntriesTotalCount() {
if(baseAccount == null){
return 0;
}
return baseAccount.dataset.getDataCount(); return baseAccount.dataset.getDataCount();
} }

+ 77
- 21
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerManager.java View File

@@ -3,10 +3,15 @@ package com.jd.blockchain.ledger.core.impl;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;


import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.CryptoSetting;
import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.LedgerInitSetting;
import com.jd.blockchain.ledger.core.LedgerConsts; import com.jd.blockchain.ledger.core.LedgerConsts;
import com.jd.blockchain.ledger.core.LedgerEditor; import com.jd.blockchain.ledger.core.LedgerEditor;
import com.jd.blockchain.ledger.core.LedgerException;
import com.jd.blockchain.ledger.core.LedgerManage; import com.jd.blockchain.ledger.core.LedgerManage;
import com.jd.blockchain.ledger.core.LedgerRepository; import com.jd.blockchain.ledger.core.LedgerRepository;
import com.jd.blockchain.storage.service.ExPolicyKVStorage; import com.jd.blockchain.storage.service.ExPolicyKVStorage;
@@ -57,26 +62,83 @@ public class LedgerManager implements LedgerManage {


@Override @Override
public LedgerRepository register(HashDigest ledgerHash, KVStorageService storageService) { public LedgerRepository register(HashDigest ledgerHash, KVStorageService storageService) {
// 加载账本数据库;
VersioningKVStorage ledgerVersioningStorage = storageService.getVersioningKVStorage(); VersioningKVStorage ledgerVersioningStorage = storageService.getVersioningKVStorage();
ExPolicyKVStorage ledgerExPolicyStorage = storageService.getExPolicyKVStorage(); ExPolicyKVStorage ledgerExPolicyStorage = storageService.getExPolicyKVStorage();
LedgerRepository ledgerRepo = new LedgerRepositoryImpl(ledgerHash, LEDGER_PREFIX, ledgerExPolicyStorage, LedgerRepository ledgerRepo = new LedgerRepositoryImpl(ledgerHash, LEDGER_PREFIX, ledgerExPolicyStorage,
ledgerVersioningStorage); ledgerVersioningStorage);


LedgerRepositoryContext ledgerCtx = new LedgerRepositoryContext();
ledgerCtx.ledgerRepo = ledgerRepo;
ledgerCtx.storageService = storageService;
// 校验 crypto service provider ;
CryptoSetting cryptoSetting = ledgerRepo.getAdminAccount().getSetting().getCryptoSetting();
checkCryptoSetting(cryptoSetting, ledgerHash);

// 创建账本上下文;
LedgerRepositoryContext ledgerCtx = new LedgerRepositoryContext(ledgerRepo, storageService);
ledgers.put(ledgerHash, ledgerCtx); ledgers.put(ledgerHash, ledgerCtx);
return ledgerRepo; return ledgerRepo;
} }


/**
* 检查账本的密码参数设置与本地节点的运行时环境是否匹配;
*
* @param cryptoSetting
* @param ledgerHash
*/
private void checkCryptoSetting(CryptoSetting cryptoSetting, HashDigest ledgerHash) {
CryptoProvider[] cryptoProviders = cryptoSetting.getSupportedProviders();
if (cryptoProviders == null || cryptoProviders.length == 0) {
throw new LedgerException("No supported crypto service providers has been setted in the ledger["
+ ledgerHash.toBase58() + "]!");
}
for (CryptoProvider cp : cryptoProviders) {
CryptoProvider regCp = Crypto.getProvider(cp.getName());
checkCryptoProviderConsistency(regCp, cp);
}
}

/**
* 检查密码服务提供者的信息是否匹配;
*
* @param registeredProvider
* @param settingProvider
*/
private void checkCryptoProviderConsistency(CryptoProvider registeredProvider, CryptoProvider settingProvider) {
if (registeredProvider == null) {
throw new LedgerException("Crypto service provider[" + settingProvider.getName()
+ "] has not registered in the runtime environment of current peer!");
}

CryptoAlgorithm[] runtimeAlgothms = registeredProvider.getAlgorithms();
CryptoAlgorithm[] settingAlgothms = settingProvider.getAlgorithms();
if (runtimeAlgothms.length != settingAlgothms.length) {
throw new LedgerException("Crypto service provider[" + settingProvider.getName()
+ "] has not registered in runtime of current peer!");
}
HashMap<Short, CryptoAlgorithm> runtimeAlgothmMap = new HashMap<Short, CryptoAlgorithm>();
for (CryptoAlgorithm alg : runtimeAlgothms) {
runtimeAlgothmMap.put(alg.code(), alg);
}
for (CryptoAlgorithm alg : settingAlgothms) {
CryptoAlgorithm regAlg = runtimeAlgothmMap.get(alg.code());
if (regAlg == null) {
throw new LedgerException(
String.format("Crypto algorithm[%s] is not defined by provider[%s] in runtime of current peer!",
alg.toString(), registeredProvider.getName()));
}
if (!regAlg.name().equals(alg.name())) {
throw new LedgerException(String.format(
"Crypto algorithm[%s] do not match the same code algorithm[%s] defined by provider[%s] in runtime of current peer!",
CryptoAlgorithm.getString(alg), CryptoAlgorithm.getString(regAlg),
registeredProvider.getName()));
}
}
}

@Override @Override
public void unregister(HashDigest ledgerHash) { public void unregister(HashDigest ledgerHash) {
LedgerRepositoryContext ledgerCtx = ledgers.get(ledgerHash);
LedgerRepositoryContext ledgerCtx = ledgers.remove(ledgerHash);
if (ledgerCtx != null) { if (ledgerCtx != null) {
ledgerCtx.ledgerRepo.close(); ledgerCtx.ledgerRepo.close();
ledgers.remove(ledgerHash);
ledgerCtx.ledgerRepo = null;
ledgerCtx.storageService = null;
} }
} }


@@ -88,18 +150,6 @@ public class LedgerManager implements LedgerManage {
*/ */
@Override @Override
public LedgerEditor newLedger(LedgerInitSetting initSetting, KVStorageService storageService) { public LedgerEditor newLedger(LedgerInitSetting initSetting, KVStorageService storageService) {
// GenesisLedgerStorageProxy genesisStorageProxy = new
// GenesisLedgerStorageProxy();
// BufferedKVStorage bufferedStorage = new
// BufferedKVStorage(genesisStorageProxy, genesisStorageProxy, false);

// LedgerEditor genesisBlockEditor =
// LedgerTransactionalEditor.createEditor(initSetting,
// bufferedStorage, bufferedStorage);

// return new LedgerInitializer(genesisBlockEditor, bufferedStorage,
// genesisStorageProxy, storageService, this);

LedgerEditor genesisBlockEditor = LedgerTransactionalEditor.createEditor(initSetting, LEDGER_PREFIX, LedgerEditor genesisBlockEditor = LedgerTransactionalEditor.createEditor(initSetting, LEDGER_PREFIX,
storageService.getExPolicyKVStorage(), storageService.getVersioningKVStorage()); storageService.getExPolicyKVStorage(), storageService.getVersioningKVStorage());
return genesisBlockEditor; return genesisBlockEditor;
@@ -110,10 +160,16 @@ public class LedgerManager implements LedgerManage {
return LEDGER_PREFIX + base58LedgerHash + LedgerConsts.KEY_SEPERATOR; return LEDGER_PREFIX + base58LedgerHash + LedgerConsts.KEY_SEPERATOR;
} }


private static class LedgerRepositoryContext { private static class LedgerRepositoryContext {


private LedgerRepository ledgerRepo;
public final LedgerRepository ledgerRepo;


private KVStorageService storageService;
public final KVStorageService storageService;

public LedgerRepositoryContext(LedgerRepository ledgerRepo, KVStorageService storageService) {
this.ledgerRepo = ledgerRepo;
this.storageService = storageService;
}
} }
} }

+ 62
- 0
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/LedgerQueryService.java View File

@@ -2,6 +2,7 @@ package com.jd.blockchain.ledger.core.impl;
import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.contract.ContractException;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.*;
import com.jd.blockchain.ledger.core.ContractAccountSet; import com.jd.blockchain.ledger.core.ContractAccountSet;
@@ -15,6 +16,10 @@ import com.jd.blockchain.ledger.core.UserAccountSet;
import com.jd.blockchain.transaction.BlockchainQueryService; import com.jd.blockchain.transaction.BlockchainQueryService;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.QueryUtil; import com.jd.blockchain.utils.QueryUtil;
import com.jd.blockchain.utils.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class LedgerQueryService implements BlockchainQueryService { public class LedgerQueryService implements BlockchainQueryService {
@@ -263,6 +268,9 @@ public class LedgerQueryService implements BlockchainQueryService {
long ver; long ver;
for (int i = 0; i < entries.length; i++) { for (int i = 0; i < entries.length; i++) {
ver = dataAccount.getDataVersion(Bytes.fromString(keys[i])); ver = dataAccount.getDataVersion(Bytes.fromString(keys[i]));
dataAccount.getBytes(Bytes.fromString(keys[i]),1);
if (ver < 0) { if (ver < 0) {
entries[i] = new KVDataObject(keys[i], -1, PrimitiveType.NIL, null); entries[i] = new KVDataObject(keys[i], -1, PrimitiveType.NIL, null);
}else { }else {
@@ -275,6 +283,60 @@ public class LedgerQueryService implements BlockchainQueryService {
return entries; return entries;
} }
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, KVInfoVO kvInfoVO) {
//parse kvInfoVO;
List<String> keyList = new ArrayList<>();
List<Long> 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, PrimitiveType.NIL, 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, PrimitiveType.NIL, null);
} else {
byte[] value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
BytesValue decodeData = BinaryProtocol.decode(value);
entries[i] = new KVDataObject(keys[i], ver, PrimitiveType.valueOf(decodeData.getType().CODE), decodeData.getValue().toBytes());
}
}
}
return entries;
}
@Override @Override
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) {


+ 5
- 0
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ContractLedgerContext.java View File

@@ -156,6 +156,11 @@ public class ContractLedgerContext implements LedgerContext {
return innerQueryService.getDataEntries(ledgerHash, address, keys); return innerQueryService.getDataEntries(ledgerHash, address, keys);
} }


@Override
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, KVInfoVO kvInfoVO) {
return innerQueryService.getDataEntries(ledgerHash, address, kvInfoVO);
}

@Override @Override
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) {
return innerQueryService.getDataEntries(ledgerHash, address, fromIndex, count); return innerQueryService.getDataEntries(ledgerHash, address, fromIndex, count);


+ 14
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/AccountSetTest.java View File

@@ -6,8 +6,12 @@ import static org.junit.Assert.assertTrue;


import org.junit.Test; import org.junit.Test;


import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator; import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.core.AccountSet; import com.jd.blockchain.ledger.core.AccountSet;
@@ -17,6 +21,11 @@ import com.jd.blockchain.ledger.core.impl.OpeningAccessPolicy;
import com.jd.blockchain.storage.service.utils.MemoryKVStorage; import com.jd.blockchain.storage.service.utils.MemoryKVStorage;


public class AccountSetTest { public class AccountSetTest {

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };



@Test @Test
public void test() { public void test() {
@@ -24,7 +33,12 @@ public class AccountSetTest {


MemoryKVStorage storage = new MemoryKVStorage(); MemoryKVStorage storage = new MemoryKVStorage();


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}
CryptoConfig cryptoConf = new CryptoConfig(); CryptoConfig cryptoConf = new CryptoConfig();
cryptoConf.setSupportedProviders(supportedProviders);
cryptoConf.setAutoVerifyHash(true); cryptoConf.setAutoVerifyHash(true);
cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256);




+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/BaseAccountTest.java View File

@@ -5,7 +5,11 @@ import static org.junit.Assert.assertFalse;


import org.junit.Test; import org.junit.Test;


import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator; import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.core.BaseAccount; import com.jd.blockchain.ledger.core.BaseAccount;
@@ -22,12 +26,21 @@ import com.jd.blockchain.utils.io.BytesUtils;
*/ */
public class BaseAccountTest { public class BaseAccountTest {


public static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

@Test @Test
public void basicTest() { public void basicTest() {
String keyPrefix = ""; String keyPrefix = "";
MemoryKVStorage testStorage = new MemoryKVStorage(); MemoryKVStorage testStorage = new MemoryKVStorage();


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConf = new CryptoConfig(); CryptoConfig cryptoConf = new CryptoConfig();
cryptoConf.setSupportedProviders(supportedProviders);
cryptoConf.setAutoVerifyHash(true); cryptoConf.setAutoVerifyHash(true);
cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConf.setHashAlgorithm(ClassicAlgorithm.SHA256);




+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerAdminAccountTest.java View File

@@ -13,8 +13,12 @@ import com.jd.blockchain.ledger.LedgerMetadata;
import org.junit.Test; import org.junit.Test;


import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator; import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.ledger.ParticipantNode;
@@ -30,6 +34,9 @@ import com.jd.blockchain.utils.net.NetworkAddress;


public class LedgerAdminAccountTest { public class LedgerAdminAccountTest {


private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

private Random rand = new Random(); private Random rand = new Random();


@Test @Test
@@ -55,7 +62,13 @@ public class LedgerAdminAccountTest {
initSetting.setConsensusSettings(new Bytes(csSysSettingBytes)); initSetting.setConsensusSettings(new Bytes(csSysSettingBytes));
initSetting.setConsensusProvider("consensus-provider"); initSetting.setConsensusProvider("consensus-provider");


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoSetting = new CryptoConfig(); CryptoConfig cryptoSetting = new CryptoConfig();
cryptoSetting.setSupportedProviders(supportedProviders);
cryptoSetting.setAutoVerifyHash(true); cryptoSetting.setAutoVerifyHash(true);
cryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256);
initSetting.setCryptoSetting(cryptoSetting); initSetting.setCryptoSetting(cryptoSetting);


+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerEditerTest.java View File

@@ -11,8 +11,11 @@ import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto; import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.SignatureFunction; import com.jd.blockchain.crypto.SignatureFunction;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.LedgerInitSetting;
@@ -34,6 +37,10 @@ import com.jd.blockchain.utils.io.BytesUtils;
import com.jd.blockchain.utils.net.NetworkAddress; import com.jd.blockchain.utils.net.NetworkAddress;


public class LedgerEditerTest { public class LedgerEditerTest {
private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };



static { static {
DataContractRegistry.register(com.jd.blockchain.ledger.TransactionContent.class); DataContractRegistry.register(com.jd.blockchain.ledger.TransactionContent.class);
@@ -109,8 +116,14 @@ public class LedgerEditerTest {


private LedgerInitSetting createLedgerInitSetting() { private LedgerInitSetting createLedgerInitSetting() {
SignatureFunction signFunc = Crypto.getSignatureFunction("ED25519"); SignatureFunction signFunc = Crypto.getSignatureFunction("ED25519");
CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}


CryptoConfig defCryptoSetting = new CryptoConfig(); CryptoConfig defCryptoSetting = new CryptoConfig();
defCryptoSetting.setSupportedProviders(supportedProviders);
defCryptoSetting.setAutoVerifyHash(true); defCryptoSetting.setAutoVerifyHash(true);
defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256); defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256);




+ 12
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitOperationTest.java View File

@@ -12,7 +12,11 @@ import org.junit.Test;
import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator; import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.LedgerInitOperation; import com.jd.blockchain.ledger.LedgerInitOperation;
@@ -27,6 +31,9 @@ import com.jd.blockchain.utils.net.NetworkAddress;


public class LedgerInitOperationTest { public class LedgerInitOperationTest {


private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

byte[] seed = null; byte[] seed = null;
byte[] csSysSettingBytes = null; byte[] csSysSettingBytes = null;
LedgerInitSettingData ledgerInitSettingData = new LedgerInitSettingData(); LedgerInitSettingData ledgerInitSettingData = new LedgerInitSettingData();
@@ -44,7 +51,12 @@ public class LedgerInitOperationTest {
csSysSettingBytes = new byte[64]; csSysSettingBytes = new byte[64];
rand.nextBytes(csSysSettingBytes); rand.nextBytes(csSysSettingBytes);


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}
CryptoConfig cryptoConfig = new CryptoConfig(); CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true); cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);




source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitSettingTest.java → source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerInitSettingSerializeTest.java View File

@@ -12,7 +12,11 @@ import org.junit.Test;
import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainKeyGenerator; import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.LedgerInitSetting;
@@ -24,12 +28,15 @@ import com.jd.blockchain.transaction.LedgerInitSettingData;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.net.NetworkAddress; import com.jd.blockchain.utils.net.NetworkAddress;


public class LedgerInitSettingTest {
public class LedgerInitSettingSerializeTest {
byte[] seed = null; byte[] seed = null;
byte[] csSysSettingBytes = null; byte[] csSysSettingBytes = null;
LedgerInitSettingData ledgerInitSettingData = new LedgerInitSettingData(); LedgerInitSettingData ledgerInitSettingData = new LedgerInitSettingData();
LedgerInitOpTemplate template = new LedgerInitOpTemplate(); LedgerInitOpTemplate template = new LedgerInitOpTemplate();


private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

@Before @Before
public void initCfg() { public void initCfg() {


@@ -41,7 +48,13 @@ public class LedgerInitSettingTest {
csSysSettingBytes = new byte[64]; csSysSettingBytes = new byte[64];
rand.nextBytes(csSysSettingBytes); rand.nextBytes(csSysSettingBytes);


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig(); CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true); cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);


@@ -71,7 +84,7 @@ public class LedgerInitSettingTest {
ConsensusParticipantData[] parties1 = Arrays.copyOf(parties, 4); ConsensusParticipantData[] parties1 = Arrays.copyOf(parties, 4);


ledgerInitSettingData.setConsensusParticipants(parties1); ledgerInitSettingData.setConsensusParticipants(parties1);
byte[] encode = BinaryProtocol.encode(ledgerInitSettingData, LedgerInitSetting.class); byte[] encode = BinaryProtocol.encode(ledgerInitSettingData, LedgerInitSetting.class);


LedgerInitSetting decode = BinaryProtocol.decode(encode); LedgerInitSetting decode = BinaryProtocol.decode(encode);

+ 16
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java View File

@@ -13,9 +13,12 @@ import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto; import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.SignatureFunction; import com.jd.blockchain.crypto.SignatureFunction;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockBody; import com.jd.blockchain.ledger.BlockBody;
import com.jd.blockchain.ledger.BlockchainKeyGenerator; import com.jd.blockchain.ledger.BlockchainKeyGenerator;
import com.jd.blockchain.ledger.BlockchainKeypair; import com.jd.blockchain.ledger.BlockchainKeypair;
@@ -54,8 +57,12 @@ public class LedgerManagerTest {
DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class);
DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class);
DataContractRegistry.register(BlockBody.class); DataContractRegistry.register(BlockBody.class);
DataContractRegistry.register(CryptoProvider.class);
} }


public static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

private SignatureFunction signatureFunction; private SignatureFunction signatureFunction;


@Before @Before
@@ -170,7 +177,16 @@ public class LedgerManagerTest {
} }


private LedgerInitSetting createLedgerInitSetting() { private LedgerInitSetting createLedgerInitSetting() {

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig defCryptoSetting = new CryptoConfig(); CryptoConfig defCryptoSetting = new CryptoConfig();

defCryptoSetting.setSupportedProviders(supportedProviders);

defCryptoSetting.setAutoVerifyHash(true); defCryptoSetting.setAutoVerifyHash(true);
defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256); defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256);




+ 27
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerMetaDataTest.java View File

@@ -15,9 +15,13 @@ import org.junit.Test;
import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.CryptoSetting; import com.jd.blockchain.ledger.CryptoSetting;
import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.ledger.ParticipantNode;
import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.CryptoConfig;
@@ -30,6 +34,10 @@ import com.jd.blockchain.utils.Bytes;
* Created by zhangshuang3 on 2018/8/31. * Created by zhangshuang3 on 2018/8/31.
*/ */
public class LedgerMetaDataTest { public class LedgerMetaDataTest {

private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

byte[] seed = null; byte[] seed = null;
String consensusProvider = "test-provider"; String consensusProvider = "test-provider";
byte[] consensusSettingBytes = null; byte[] consensusSettingBytes = null;
@@ -56,7 +64,13 @@ public class LedgerMetaDataTest {
// ConsensusConfig consensusConfig = new ConsensusConfig(); // ConsensusConfig consensusConfig = new ConsensusConfig();
// consensusConfig.setValue(settingValue);ClassicCryptoService.ED25519_ALGORITHM // consensusConfig.setValue(settingValue);ClassicCryptoService.ED25519_ALGORITHM


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig(); CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true); cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);


@@ -93,7 +107,13 @@ public class LedgerMetaDataTest {
// ConsensusConfig consensusConfig = new ConsensusConfig(); // ConsensusConfig consensusConfig = new ConsensusConfig();
// consensusConfig.setValue(settingValue); // consensusConfig.setValue(settingValue);


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig(); CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true); cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);


@@ -133,7 +153,14 @@ public class LedgerMetaDataTest {
@Test @Test
public void testSerialize_CryptoSetting() { public void testSerialize_CryptoSetting() {
// LedgerCodes.METADATA_LEDGER_SETTING_CRYPTO // LedgerCodes.METADATA_LEDGER_SETTING_CRYPTO

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig(); CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setAutoVerifyHash(true); cryptoConfig.setAutoVerifyHash(true);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);
byte[] encodeBytes = BinaryProtocol.encode(cryptoConfig, CryptoSetting.class); byte[] encodeBytes = BinaryProtocol.encode(cryptoConfig, CryptoSetting.class);


+ 13
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerTestUtils.java View File

@@ -4,10 +4,13 @@ import java.util.Random;


import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto; import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.SignatureFunction; import com.jd.blockchain.crypto.SignatureFunction;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainIdentityData; import com.jd.blockchain.ledger.BlockchainIdentityData;
import com.jd.blockchain.ledger.CryptoSetting; import com.jd.blockchain.ledger.CryptoSetting;
import com.jd.blockchain.ledger.PreparedTransaction; import com.jd.blockchain.ledger.PreparedTransaction;
@@ -22,6 +25,9 @@ public class LedgerTestUtils {


// private static ThreadLocalRandom rand = ThreadLocalRandom.current(); // private static ThreadLocalRandom rand = ThreadLocalRandom.current();


private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

private static Random rand = new Random(); private static Random rand = new Random();


public static TransactionRequest createTxRequest(HashDigest ledgerHash) { public static TransactionRequest createTxRequest(HashDigest ledgerHash) {
@@ -76,7 +82,14 @@ public class LedgerTestUtils {
} }


public static CryptoSetting createDefaultCryptoSetting() { public static CryptoSetting createDefaultCryptoSetting() {

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoSetting = new CryptoConfig(); CryptoConfig cryptoSetting = new CryptoConfig();
cryptoSetting.setSupportedProviders(supportedProviders);
cryptoSetting.setAutoVerifyHash(true); cryptoSetting.setAutoVerifyHash(true);
cryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256);
return cryptoSetting; return cryptoSetting;


+ 26
- 0
source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/MerkleDataSetTest.java View File

@@ -14,8 +14,12 @@ import java.util.Set;


import org.junit.Test; import org.junit.Test;


import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm; import com.jd.blockchain.crypto.service.classic.ClassicAlgorithm;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.CryptoConfig;
import com.jd.blockchain.ledger.core.MerkleDataSet; import com.jd.blockchain.ledger.core.MerkleDataSet;
import com.jd.blockchain.ledger.core.MerkleProof; import com.jd.blockchain.ledger.core.MerkleProof;
@@ -26,13 +30,23 @@ import com.jd.blockchain.utils.io.BytesUtils;


public class MerkleDataSetTest { public class MerkleDataSetTest {


private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

/** /**
* 测试存储的增长; * 测试存储的增长;
*/ */
@Test @Test
public void testStorageIncreasement() { public void testStorageIncreasement() {

CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

String keyPrefix = ""; String keyPrefix = "";
CryptoConfig cryptoConfig = new CryptoConfig(); CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);
cryptoConfig.setAutoVerifyHash(true); cryptoConfig.setAutoVerifyHash(true);


@@ -116,7 +130,13 @@ public class MerkleDataSetTest {
String keyPrefix = ""; String keyPrefix = "";
Random rand = new Random(); Random rand = new Random();


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig(); CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);
cryptoConfig.setAutoVerifyHash(true); cryptoConfig.setAutoVerifyHash(true);


@@ -281,7 +301,13 @@ public class MerkleDataSetTest {
String keyPrefix = ""; String keyPrefix = "";
Random rand = new Random(); Random rand = new Random();


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}

CryptoConfig cryptoConfig = new CryptoConfig(); CryptoConfig cryptoConfig = new CryptoConfig();
cryptoConfig.setSupportedProviders(supportedProviders);
cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256); cryptoConfig.setHashAlgorithm(ClassicAlgorithm.SHA256);
cryptoConfig.setAutoVerifyHash(true); cryptoConfig.setAutoVerifyHash(true);




+ 48
- 26
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ContractEventSendOperation.java View File

@@ -1,26 +1,48 @@
package com.jd.blockchain.ledger;
import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.utils.Bytes;
/**
* @author huanghaiquan
*
*/
@DataContract(code= DataCodes.TX_OP_CONTRACT_EVENT_SEND)
public interface ContractEventSendOperation extends Operation {
@DataField(order=2, primitiveType=PrimitiveType.BYTES)
Bytes getContractAddress();
@DataField(order=3, primitiveType=PrimitiveType.TEXT)
String getEvent();
@DataField(order=4, primitiveType=PrimitiveType.BYTES)
byte[] getArgs();
}
package com.jd.blockchain.ledger;

import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.utils.Bytes;

/**
* @author huanghaiquan
*
*/
@DataContract(code = DataCodes.TX_OP_CONTRACT_EVENT_SEND)
public interface ContractEventSendOperation extends Operation {

/**
* 响应事件的合约地址;
*
* @return
*/
@DataField(order = 2, primitiveType = PrimitiveType.BYTES)
Bytes getContractAddress();

/**
* 事件名;
*
* @return
*/
@DataField(order = 3, primitiveType = PrimitiveType.TEXT)
String getEvent();

/**
* 事件参数;
*
* @return
*/
@DataField(order = 4, primitiveType = PrimitiveType.BYTES)
byte[] getArgs();

/**
* 时间戳;
*
* @return
*/
@DataField(order = 5, primitiveType = PrimitiveType.INT64)
long getTs();

}

+ 0
- 12
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoProviderInfo.java View File

@@ -1,12 +0,0 @@
package com.jd.blockchain.ledger;

import com.jd.blockchain.crypto.CryptoAlgorithm;

public interface CryptoProviderInfo {
String getName();
CryptoAlgorithm[] getAlgorithms();
}

+ 13
- 1
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/CryptoSetting.java View File

@@ -4,6 +4,7 @@ import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField; import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.crypto.CryptoProvider;


/** /**
* 默克尔树算法相关的配置; * 默克尔树算法相关的配置;
@@ -14,6 +15,16 @@ import com.jd.blockchain.consts.DataCodes;
@DataContract(code = DataCodes.METADATA_CRYPTO_SETTING) @DataContract(code = DataCodes.METADATA_CRYPTO_SETTING)
public interface CryptoSetting { public interface CryptoSetting {


/**
* 系统支持的密码服务提供者;
*
* @return
*/
@DataField(order = 0, refContract = true, list = true)
public CryptoProvider[] getSupportedProviders();

/** /**
* 系统中使用的 Hash 算法; <br> * 系统中使用的 Hash 算法; <br>
* *
@@ -27,7 +38,7 @@ public interface CryptoSetting {
public short getHashAlgorithm(); public short getHashAlgorithm();


/** /**
* 当有完整性证明的数据被从持久化介质中加载时,是否对其进行完整性校验(重新计算 hash 比对是否一致); <br>
* 当有加载附带哈希摘要的数据时,是否重新计算哈希摘要进行完整性校验; <br>
* *
* 如果为 true ,则自动进行校验,如果校验失败,会引发异常; <br> * 如果为 true ,则自动进行校验,如果校验失败,会引发异常; <br>
* *
@@ -37,5 +48,6 @@ public interface CryptoSetting {
*/ */
@DataField(order = 2, primitiveType = PrimitiveType.BOOLEAN) @DataField(order = 2, primitiveType = PrimitiveType.BOOLEAN)
public boolean getAutoVerifyHash(); public boolean getAutoVerifyHash();


} }

+ 26
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVDataVO.java View File

@@ -0,0 +1,26 @@
package com.jd.blockchain.ledger;

/**
* @author zhaogw
* date 2019/5/14 14:17
*/
public class KVDataVO {
private String key;
private long[] version;

public String getKey() {
return key;
}

public void setKey(String key) {
this.key = key;
}

public long[] getVersion() {
return version;
}

public void setVersion(long[] version) {
this.version = version;
}
}

+ 18
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/KVInfoVO.java View File

@@ -0,0 +1,18 @@
package com.jd.blockchain.ledger;

/**
* for BlockBrowserController.java, param is json ,then match it;
* @author zhaogw
* date 2019/5/14 14:19
*/
public class KVInfoVO {
private KVDataVO[] data;

public KVDataVO[] getData() {
return data;
}

public void setData(KVDataVO[] data) {
this.data = data;
}
}

+ 1
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNode.java View File

@@ -22,6 +22,7 @@ public interface ParticipantNode {// extends ConsensusNode, ParticipantInfo {
* *
* @return * @return
*/ */
@DataField(order = 0, primitiveType = PrimitiveType.INT32)
int getId(); int getId();


/** /**


+ 21
- 21
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContent.java View File

@@ -1,21 +1,21 @@
package com.jd.blockchain.ledger;
import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.crypto.HashDigest;
/**
* 交易内容;
*
* @author huanghaiquan
*
*/
@DataContract(code= DataCodes.TX_CONTENT)
public interface TransactionContent extends TransactionContentBody, HashObject {
@Override
@DataField(order=1, primitiveType = PrimitiveType.BYTES)
HashDigest getHash();
}
package com.jd.blockchain.ledger;
import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.crypto.HashDigest;
/**
* 交易内容;
*
* @author huanghaiquan
*
*/
@DataContract(code= DataCodes.TX_CONTENT)
public interface TransactionContent extends TransactionContentBody, HashObject {
@Override
@DataField(order=1, primitiveType = PrimitiveType.BYTES)
HashDigest getHash();
}

+ 36
- 36
source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/TransactionContentBody.java View File

@@ -1,36 +1,36 @@
package com.jd.blockchain.ledger;
import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.crypto.HashDigest;
/**
* 交易内容;
*
* @author huanghaiquan
*
*/
@DataContract(code = DataCodes.TX_CONTENT_BODY)
public interface TransactionContentBody {
/**
* 执行交易的账本地址;
*
* 注:除了账本的创世交易之外,任何交易的账本地址都不允许为 null;
*
* @return
*/
@DataField(order = 1, primitiveType = PrimitiveType.BYTES)
HashDigest getLedgerHash();
/**
* 操作列表;
*
* @return
*/
@DataField(order = 2, list = true, refContract = true, genericContract = true)
Operation[] getOperations();
}
package com.jd.blockchain.ledger;
import com.jd.blockchain.binaryproto.DataContract;
import com.jd.blockchain.binaryproto.DataField;
import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.consts.DataCodes;
import com.jd.blockchain.crypto.HashDigest;
/**
* 交易内容;
*
* @author huanghaiquan
*
*/
@DataContract(code = DataCodes.TX_CONTENT_BODY)
public interface TransactionContentBody {
/**
* 执行交易的账本地址;
*
* 注:除了账本的创世交易之外,任何交易的账本地址都不允许为 null;
*
* @return
*/
@DataField(order = 1, primitiveType = PrimitiveType.BYTES)
HashDigest getLedgerHash();
/**
* 操作列表;
*
* @return
*/
@DataField(order = 2, list = true, refContract = true, genericContract = true)
Operation[] getOperations();
}

+ 2
- 0
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainQueryService.java View File

@@ -261,6 +261,8 @@ public interface BlockchainQueryService {
*/ */
KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String... keys); KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, String... keys);
KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, KVInfoVO kvInfoVO);
/** /**
* 返回指定数据账户中KV数据的总数; <br> * 返回指定数据账户中KV数据的总数; <br>
* *


+ 50
- 40
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractEventSendOpTemplate.java View File

@@ -1,40 +1,50 @@
package com.jd.blockchain.transaction;
import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.ledger.ContractEventSendOperation;
import com.jd.blockchain.utils.Bytes;
public class ContractEventSendOpTemplate implements ContractEventSendOperation {
static {
DataContractRegistry.register(ContractEventSendOperation.class);
}
private Bytes contractAddress;
private byte[] args;
private String event;
public ContractEventSendOpTemplate() {
}
public ContractEventSendOpTemplate(Bytes contractAddress, String event, byte[] args) {
this.contractAddress = contractAddress;
this.event = event;
this.args = args;
}
@Override
public Bytes getContractAddress() {
return contractAddress;
}
@Override
public String getEvent() {
return event;
}
@Override
public byte[] getArgs() {
return args;
}
}
package com.jd.blockchain.transaction;

import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.ledger.ContractEventSendOperation;
import com.jd.blockchain.utils.Bytes;

public class ContractEventSendOpTemplate implements ContractEventSendOperation {
static {
DataContractRegistry.register(ContractEventSendOperation.class);
}

private Bytes contractAddress;
private byte[] args;
private String event;
private long ts;

public ContractEventSendOpTemplate() {
}

public ContractEventSendOpTemplate(Bytes contractAddress, String event, byte[] args) {
this.contractAddress = contractAddress;
this.event = event;
this.args = args;
}

@Override
public Bytes getContractAddress() {
return contractAddress;
}

@Override
public String getEvent() {
return event;
}

@Override
public byte[] getArgs() {
return args;
}

@Override
public long getTs() {
return ts;
}

public void setTs(long ts) {
this.ts = ts;
}
}

+ 4
- 3
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractEventSendOperationBuilderImpl.java View File

@@ -4,18 +4,19 @@ import com.jd.blockchain.ledger.ContractEventSendOperation;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
@Deprecated @Deprecated
class ContractEventSendOperationBuilderImpl implements ContractEventSendOperationBuilder{
class ContractEventSendOperationBuilderImpl implements ContractEventSendOperationBuilder {
@Override @Override
public ContractEventSendOperation send(String address, String event, byte[] args) { public ContractEventSendOperation send(String address, String event, byte[] args) {
ContractEventSendOpTemplate op = new ContractEventSendOpTemplate(Bytes.fromBase58(address), event, args); ContractEventSendOpTemplate op = new ContractEventSendOpTemplate(Bytes.fromBase58(address), event, args);
op.setTs(System.currentTimeMillis());
return op; return op;
} }
@Override @Override
public ContractEventSendOperation send(Bytes address, String event, byte[] args) { public ContractEventSendOperation send(Bytes address, String event, byte[] args) {
ContractEventSendOpTemplate op = new ContractEventSendOpTemplate(address, event, args); ContractEventSendOpTemplate op = new ContractEventSendOpTemplate(address, event, args);
op.setTs(System.currentTimeMillis());
return op; return op;
} }


+ 39
- 8
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ContractInvocationProxy.java View File

@@ -1,22 +1,53 @@
package com.jd.blockchain.transaction; package com.jd.blockchain.transaction;


import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.serialize.binary.BinarySerializeUtils;

import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; import java.lang.reflect.Method;


public class ContractInvocationProxy implements InvocationHandler {
private String contractMessage;
public class ContractInvocationProxy implements InvocationHandler {

// private String contractMessage;

private Bytes contractAddress;

private ContractType contractType;


private ContractEventSendOperationBuilder sendOpBuilder; private ContractEventSendOperationBuilder sendOpBuilder;

public ContractInvocationProxy(Bytes contractAddress, ContractType contractType,
ContractEventSendOperationBuilder sendOpBuilder) {
this.contractAddress = contractAddress;
this.contractType = contractType;
this.sendOpBuilder = sendOpBuilder;
}


@Override @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// TODO Auto-generated method stub

if(contractType == null){
return "contractType == null, no invoke really.";
}

String event = contractType.getEvent(method);
if (event == null) {
// 适配 Object 对象的方法;
// toString 方法;
return String.format("[%s]-%s", contractAddress, contractType.toString());

// hashCode 方法;
}
// 合约方法;
byte[] argBytes = serializeArgs(args);
sendOpBuilder.send(contractAddress, event, argBytes);

// TODO: 暂时未考虑有返回值的情况;
return null; return null;
} }


private byte[] serializeArgs(Object[] args) {
// TODO 根据方法参数的定义序列化参数;
return BinarySerializeUtils.serialize(args);
}
} }

+ 2
- 2
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/DataAccountKVSetOpTemplate.java View File

@@ -49,7 +49,7 @@ public class DataAccountKVSetOpTemplate implements DataAccountKVSetOperation {
public void set(String key, BytesValue value, long expVersion) { public void set(String key, BytesValue value, long expVersion) {
if (kvset.containsKey(key)) { if (kvset.containsKey(key)) {
throw new IllegalArgumentException("Cann't set the same key repeatly!");
throw new IllegalArgumentException("Cann't set the same key repeatedly!");
} }
KVData kvdata = new KVData(key, value, expVersion); KVData kvdata = new KVData(key, value, expVersion);
kvset.put(key, kvdata); kvset.put(key, kvdata);
@@ -57,7 +57,7 @@ public class DataAccountKVSetOpTemplate implements DataAccountKVSetOperation {
public void set(KVData kvData) { public void set(KVData kvData) {
if (kvset.containsKey(kvData.getKey())) { if (kvset.containsKey(kvData.getKey())) {
throw new IllegalArgumentException("Cann't set the same key repeatly!");
throw new IllegalArgumentException("Cann't set the same key repeatedly!");
} }
kvset.put(kvData.getKey(), kvData); kvset.put(kvData.getKey(), kvData);
} }


+ 93
- 93
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java View File

@@ -1,93 +1,93 @@
package com.jd.blockchain.transaction;
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.TransactionBuilder;
import com.jd.blockchain.ledger.TransactionContent;
import com.jd.blockchain.ledger.TransactionContentBody;
import com.jd.blockchain.ledger.TransactionRequestBuilder;
import com.jd.blockchain.utils.Bytes;
public class TxBuilder implements TransactionBuilder {
static {
DataContractRegistry.register(TransactionContentBody.class);
}
private BlockchainOperationFactory opFactory = new BlockchainOperationFactory();
private static final String DEFAULT_HASH_ALGORITHM = "SHA256";
private HashDigest ledgerHash;
public TxBuilder(HashDigest ledgerHash) {
this.ledgerHash = ledgerHash;
}
@Override
public HashDigest getLedgerHash() {
return ledgerHash;
}
@Override
public TransactionRequestBuilder prepareRequest() {
TransactionContent txContent = prepareContent();
return new TxRequestBuilder(txContent);
}
@Override
public TransactionContent prepareContent() {
TxContentBlob txContent = new TxContentBlob(ledgerHash);
txContent.addOperations(opFactory.getOperations());
byte[] contentBodyBytes = BinaryProtocol.encode(txContent, TransactionContentBody.class);
HashDigest contentHash = Crypto.getHashFunction(DEFAULT_HASH_ALGORITHM).hash(contentBodyBytes);
txContent.setHash(contentHash);
return txContent;
}
@Override
public LedgerInitOperationBuilder ledgers() {
return opFactory.ledgers();
}
@Override
public UserRegisterOperationBuilder users() {
return opFactory.users();
}
@Override
public DataAccountRegisterOperationBuilder dataAccounts() {
return opFactory.dataAccounts();
}
@Override
public DataAccountKVSetOperationBuilder dataAccount(String accountAddress) {
return opFactory.dataAccount(accountAddress);
}
@Override
public DataAccountKVSetOperationBuilder dataAccount(Bytes accountAddress) {
return opFactory.dataAccount(accountAddress);
}
@Override
public ContractCodeDeployOperationBuilder contracts() {
return opFactory.contracts();
}
@Override
public ContractEventSendOperationBuilder contractEvents() {
return opFactory.contractEvents();
}
@Override
public <T> T contract(String address, Class<T> contractIntf) {
// TODO Auto-generated method stub
throw new IllegalStateException("Not implemented.");
}
}
package com.jd.blockchain.transaction;
import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.TransactionBuilder;
import com.jd.blockchain.ledger.TransactionContent;
import com.jd.blockchain.ledger.TransactionContentBody;
import com.jd.blockchain.ledger.TransactionRequestBuilder;
import com.jd.blockchain.utils.Bytes;
public class TxBuilder implements TransactionBuilder {
static {
DataContractRegistry.register(TransactionContentBody.class);
}
private BlockchainOperationFactory opFactory = new BlockchainOperationFactory();
private static final String DEFAULT_HASH_ALGORITHM = "SHA256";
private HashDigest ledgerHash;
public TxBuilder(HashDigest ledgerHash) {
this.ledgerHash = ledgerHash;
}
@Override
public HashDigest getLedgerHash() {
return ledgerHash;
}
@Override
public TransactionRequestBuilder prepareRequest() {
TransactionContent txContent = prepareContent();
return new TxRequestBuilder(txContent);
}
@Override
public TransactionContent prepareContent() {
TxContentBlob txContent = new TxContentBlob(ledgerHash);
txContent.addOperations(opFactory.getOperations());
byte[] contentBodyBytes = BinaryProtocol.encode(txContent, TransactionContentBody.class);
HashDigest contentHash = Crypto.getHashFunction(DEFAULT_HASH_ALGORITHM).hash(contentBodyBytes);
txContent.setHash(contentHash);
return txContent;
}
@Override
public LedgerInitOperationBuilder ledgers() {
return opFactory.ledgers();
}
@Override
public UserRegisterOperationBuilder users() {
return opFactory.users();
}
@Override
public DataAccountRegisterOperationBuilder dataAccounts() {
return opFactory.dataAccounts();
}
@Override
public DataAccountKVSetOperationBuilder dataAccount(String accountAddress) {
return opFactory.dataAccount(accountAddress);
}
@Override
public DataAccountKVSetOperationBuilder dataAccount(Bytes accountAddress) {
return opFactory.dataAccount(accountAddress);
}
@Override
public ContractCodeDeployOperationBuilder contracts() {
return opFactory.contracts();
}
@Override
public ContractEventSendOperationBuilder contractEvents() {
return opFactory.contractEvents();
}
@Override
public <T> T contract(String address, Class<T> contractIntf) {
// TODO Auto-generated method stub
throw new IllegalStateException("Not implemented.");
}
}

+ 91
- 91
source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxContentBlob.java View File

@@ -1,91 +1,91 @@
package com.jd.blockchain.transaction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.Operation;
import com.jd.blockchain.ledger.TransactionContent;
import com.jd.blockchain.utils.io.NumberMask;
/**
* 交易内容的数据块;
* <p>
*
* 包含原始交易请求的数据块;
*
* @author huanghaiquan
*
*/
public class TxContentBlob implements TransactionContent {
/**
* 操作数量的最大值;
*/
public static final int MAX_OP_COUNT = NumberMask.SHORT.MAX_BOUNDARY_SIZE;
private List<Operation> operationList = new ArrayList<Operation>();
private HashDigest hash;
private HashDigest ledgerHash;
public TxContentBlob(HashDigest ledgerHash) {
this.ledgerHash = ledgerHash;
}
/**
* 交易内容的哈希值;
*/
@Override
public HashDigest getHash() {
return this.hash;
}
/**
* 更新交易内容的哈希值;
* <p>
* 注:当前对象只充当值对象,不校验指定哈希值的完整性,调用者应该在外部实施完整性校验;
*
* @param hash
*/
public void setHash(HashDigest hash) {
this.hash = hash;
}
/**
* 交易请求链的hash
*
* @return
*/
@Override
public HashDigest getLedgerHash() {
return ledgerHash;
}
public void setLedgerHash(HashDigest ledgerHash) {
this.ledgerHash = ledgerHash;
}
@Override
public Operation[] getOperations() {
return operationList.toArray(new Operation[operationList.size()]);
}
public void setOperations(Object[] operations) {
// in array's case ,cast will failed!
for (Object operation : operations) {
Operation op = (Operation) operation;
addOperation(op);
}
}
public void addOperation(Operation operation) {
operationList.add(operation);
}
public void addOperations(Collection<Operation> operations) {
operationList.addAll(operations);
}
}
package com.jd.blockchain.transaction;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.Operation;
import com.jd.blockchain.ledger.TransactionContent;
import com.jd.blockchain.utils.io.NumberMask;
/**
* 交易内容的数据块;
* <p>
*
* 包含原始交易请求的数据块;
*
* @author huanghaiquan
*
*/
public class TxContentBlob implements TransactionContent {
/**
* 操作数量的最大值;
*/
public static final int MAX_OP_COUNT = NumberMask.SHORT.MAX_BOUNDARY_SIZE;
private List<Operation> operationList = new ArrayList<Operation>();
private HashDigest hash;
private HashDigest ledgerHash;
public TxContentBlob(HashDigest ledgerHash) {
this.ledgerHash = ledgerHash;
}
/**
* 交易内容的哈希值;
*/
@Override
public HashDigest getHash() {
return this.hash;
}
/**
* 更新交易内容的哈希值;
* <p>
* 注:当前对象只充当值对象,不校验指定哈希值的完整性,调用者应该在外部实施完整性校验;
*
* @param hash
*/
public void setHash(HashDigest hash) {
this.hash = hash;
}
/**
* 交易请求链的hash
*
* @return
*/
@Override
public HashDigest getLedgerHash() {
return ledgerHash;
}
public void setLedgerHash(HashDigest ledgerHash) {
this.ledgerHash = ledgerHash;
}
@Override
public Operation[] getOperations() {
return operationList.toArray(new Operation[operationList.size()]);
}
public void setOperations(Object[] operations) {
// in array's case ,cast will failed!
for (Object operation : operations) {
Operation op = (Operation) operation;
addOperation(op);
}
}
public void addOperation(Operation operation) {
operationList.add(operation);
}
public void addOperations(Collection<Operation> operations) {
operationList.addAll(operations);
}
}

+ 0
- 5
source/peer/pom.xml View File

@@ -20,11 +20,6 @@
<artifactId>consensus-framework</artifactId> <artifactId>consensus-framework</artifactId>
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>state-transfer</artifactId>
<version>${project.version}</version>
</dependency>
<dependency> <dependency>
<groupId>com.jd.blockchain</groupId> <groupId>com.jd.blockchain</groupId>
<artifactId>ledger-rpc</artifactId> <artifactId>ledger-rpc</artifactId>


+ 0
- 2
source/peer/src/main/java/com/jd/blockchain/peer/LedgerBindingConfigAware.java View File

@@ -4,8 +4,6 @@ import com.jd.blockchain.consensus.service.NodeServer;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.tools.initializer.LedgerBindingConfig; import com.jd.blockchain.tools.initializer.LedgerBindingConfig;


import java.util.List;

public interface LedgerBindingConfigAware { public interface LedgerBindingConfigAware {
void setConfig(LedgerBindingConfig config); void setConfig(LedgerBindingConfig config);


+ 72
- 6
source/peer/src/main/java/com/jd/blockchain/peer/web/LedgerQueryController.java View File

@@ -1,21 +1,30 @@
package com.jd.blockchain.peer.web; package com.jd.blockchain.peer.web;
import com.jd.blockchain.contract.ContractException;
import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.*;
import com.jd.blockchain.ledger.core.*;
import com.jd.blockchain.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
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 org.springframework.web.bind.annotation.*;
import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.BinaryProtocol;
import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.binaryproto.PrimitiveType;
import com.jd.blockchain.crypto.HashDigest; 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.transaction.BlockchainQueryService;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.QueryUtil; import com.jd.blockchain.utils.QueryUtil;
import java.util.ArrayList;
import java.util.List;
@RestController @RestController
@RequestMapping(path = "/") @RequestMapping(path = "/")
public class LedgerQueryController implements BlockchainQueryService { public class LedgerQueryController implements BlockchainQueryService {
@@ -342,6 +351,63 @@ public class LedgerQueryController implements BlockchainQueryService {
return entries; 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<String> keyList = new ArrayList<>();
List<Long> 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, PrimitiveType.NIL, 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, PrimitiveType.NIL, null);
} else {
byte[] value = dataAccount.getBytes(Bytes.fromString(keys[i]), ver);
BytesValue decodeData = BinaryProtocol.decode(value);
entries[i] = new KVDataObject(keys[i], ver, PrimitiveType.valueOf(decodeData.getType().CODE), decodeData.getValue().toBytes());
}
}
}
return entries;
}
@RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries") @RequestMapping(method = {RequestMethod.GET, RequestMethod.POST}, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
@Override @Override
public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash, public KVDataEntry[] getDataEntries(@PathVariable(name = "ledgerHash") HashDigest ledgerHash,


+ 15
- 156
source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java View File

@@ -5,10 +5,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import com.jd.blockchain.ledger.*;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -35,6 +31,21 @@ import com.jd.blockchain.consensus.service.NodeServer;
import com.jd.blockchain.consensus.service.ServerSettings; import com.jd.blockchain.consensus.service.ServerSettings;
import com.jd.blockchain.consensus.service.StateMachineReplicate; import com.jd.blockchain.consensus.service.StateMachineReplicate;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.ledger.ContractCodeDeployOperation;
import com.jd.blockchain.ledger.ContractEventSendOperation;
import com.jd.blockchain.ledger.CryptoSetting;
import com.jd.blockchain.ledger.DataAccountKVSetOperation;
import com.jd.blockchain.ledger.DataAccountRegisterOperation;
import com.jd.blockchain.ledger.EndpointRequest;
import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInitOperation;
import com.jd.blockchain.ledger.NodeRequest;
import com.jd.blockchain.ledger.Operation;
import com.jd.blockchain.ledger.TransactionContent;
import com.jd.blockchain.ledger.TransactionContentBody;
import com.jd.blockchain.ledger.TransactionRequest;
import com.jd.blockchain.ledger.TransactionResponse;
import com.jd.blockchain.ledger.UserRegisterOperation;
import com.jd.blockchain.ledger.core.LedgerAdminAccount; import com.jd.blockchain.ledger.core.LedgerAdminAccount;
import com.jd.blockchain.ledger.core.LedgerManage; import com.jd.blockchain.ledger.core.LedgerManage;
import com.jd.blockchain.ledger.core.LedgerRepository; import com.jd.blockchain.ledger.core.LedgerRepository;
@@ -68,35 +79,17 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag
public static final int MIN_GATEWAY_ID = 10000; public static final int MIN_GATEWAY_ID = 10000;
// @Autowired
// private PeerSettings peerSetting;
// @Autowired
// private ConsensusTransactionService consensusService;
// private ConsensusPeer consensusReplica;
@Autowired @Autowired
private LedgerManage ledgerManager; private LedgerManage ledgerManager;
@Autowired @Autowired
private DbConnectionFactory connFactory; private DbConnectionFactory connFactory;
// private Map<HashDigest, DbConnection> ledgerConns = new
// ConcurrentHashMap<>();
private Map<HashDigest, MsgQueueMessageDispatcher> ledgerTxConverters = new ConcurrentHashMap<>(); private Map<HashDigest, MsgQueueMessageDispatcher> ledgerTxConverters = new ConcurrentHashMap<>();
private Map<HashDigest, NodeServer> ledgerPeers = new ConcurrentHashMap<>(); private Map<HashDigest, NodeServer> ledgerPeers = new ConcurrentHashMap<>();
private Map<HashDigest, CryptoSetting> ledgerCryptoSettings = new ConcurrentHashMap<>(); private Map<HashDigest, CryptoSetting> ledgerCryptoSettings = new ConcurrentHashMap<>();
// private Map<ConsensusNode, ConsensusRealm> nodeRealms = new
// ConcurrentHashMap<>();
// private Map<HashDigest, ConsensusRealm> ledgerRealms = new
// ConcurrentHashMap<>();
// private Map<HashDigest, ConsensusRealm> ledgerRealmsNoConflict = new
// ConcurrentHashMap<>();
private LedgerBindingConfig config; private LedgerBindingConfig config;
@@ -106,9 +99,6 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag
@Autowired @Autowired
private StateMachineReplicate consensusStateManager; private StateMachineReplicate consensusStateManager;
// private static int step = 0;
// private static int temp = 0;
static { static {
DataContractRegistry.register(LedgerInitOperation.class); DataContractRegistry.register(LedgerInitOperation.class);
DataContractRegistry.register(LedgerBlock.class); DataContractRegistry.register(LedgerBlock.class);
@@ -134,24 +124,6 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag
} }
@PostConstruct
private void init() {
}
@PreDestroy
private void destroy() {
// DbConnection[] conns = ledgerConns.values().toArray(new DbConnection[ledgerConns.size()]);
// ledgerConns.clear();
// for (DbConnection conn : conns) {
// try {
// conn.close();
// } catch (Exception e) {
// // Ignore;
// }
// }
}
/** /**
* 接入认证; * 接入认证;
* *
@@ -234,42 +206,8 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag
HashDigest[] ledgerHashs = config.getLedgerHashs(); HashDigest[] ledgerHashs = config.getLedgerHashs();
for (HashDigest ledgerHash : ledgerHashs) { for (HashDigest ledgerHash : ledgerHashs) {
setConfig(config,ledgerHash); setConfig(config,ledgerHash);
// LedgerBindingConfig.BindingConfig bindingConfig = config.getLedger(ledgerHash);
// DbConnection dbConnNew = connFactory.connect(bindingConfig.getDbConnection().getUri(),
// bindingConfig.getDbConnection().getPassword());
// LedgerRepository ledgerRepository = ledgerManager.register(ledgerHash, dbConnNew.getStorageService());
//
// // load provider;
// LedgerAdminAccount ledgerAdminAccount = ledgerRepository.getAdminAccount();
// String consensusProvider = ledgerAdminAccount.getSetting().getConsensusProvider();
// ConsensusProvider provider = ConsensusProviders.getProvider(consensusProvider);
// // find current node;
// Bytes csSettingBytes = ledgerAdminAccount.getSetting().getConsensusSetting();
// ConsensusSettings csSettings = provider.getSettingsFactory().getConsensusSettingsEncoder()
// .decode(csSettingBytes.toBytes());
// NodeSettings currentNode = null;
// for (NodeSettings nodeSettings : csSettings.getNodes()) {
// if (nodeSettings.getAddress().equals(bindingConfig.getParticipant().getAddress())) {
// currentNode = nodeSettings;
// }
// }
// if (currentNode == null) {
// throw new IllegalArgumentException(
// "Current node is not found from the consensus settings of ledger[" + ledgerHash.toBase58()
// + "]!");
// }
// ServerSettings serverSettings = provider.getServerFactory().buildServerSettings(ledgerHash.toBase58(), csSettings, currentNode.getAddress());
//
// NodeServer server = provider.getServerFactory().setupServer(serverSettings, consensusMessageHandler,
// consensusStateManager);
// ledgerPeers.put(ledgerHash, server);
// ledgerCryptoSettings.put(ledgerHash, ledgerAdminAccount.getSetting().getCryptoSetting());
} }
// remove duplicate consensus realm,and establish consensus peer and consensus
// realm corresponding relationship
// initBindingConfig(config);
this.config = config; this.config = config;
} catch (Exception e) { } catch (Exception e) {
@@ -314,46 +252,6 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag
return server; return server;
} }
// private void initBindingConfig(LedgerBindingConfig config) {
// boolean intersection = false;
// // to remove intersection consensus realm
// for (HashDigest hashDigest : ledgerRealms.keySet()) {
// ConsensusRealm consensusRealm1i = ledgerRealms.get(hashDigest);
// for (ConsensusRealm consensusRealm1j : ledgerRealms.values()) {
// // avoid compare with myself
// if (consensusRealm1i.equals(consensusRealm1j)) {
// continue;
// }
// if (consensusRealm1i.hasIntersection(consensusRealm1j)) {
// intersection = true;
// break;
// }
// }
// // prompt consensus realm conflict info
// if (intersection == true) {
// ConsoleUtils.info("\r\nconsensus realm intersection with other consensus
// realm\r\n");
// continue;
// }
// if (intersection == false) {
// // add consensus realm without conflict to ledgerRealmsNoConflict
// ledgerRealmsNoConflict.put(hashDigest, consensusRealm1i);
//
// // String consensusSystemFile =
// config.getLedger(hashDigest).getCsConfigFile();
// int currentId = config.getLedger(hashDigest).getParticipant().getId();
// // init consensusSystemConfig;
// ConsensusProperties csProps =
// ConsensusProperties.resolve(consensusRealm1i.getSetting());
// ConsensusPeer consensusPeer = new ConsensusPeer(consensusRealm1i, currentId,
// consensusService,
// csProps.getProperties());
// ledgerPeers.put(hashDigest, consensusPeer);
// }
// } // END OF FOR:get ledgerRealmsNoConflict and ledgerPeers
//
// }
@Override @Override
public ConsensusRealm[] getRealms() { public ConsensusRealm[] getRealms() {
throw new IllegalStateException("Not implemented!"); throw new IllegalStateException("Not implemented!");
@@ -364,45 +262,6 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag
for (NodeServer peer : ledgerPeers.values()) { for (NodeServer peer : ledgerPeers.values()) {
runRealm(peer); runRealm(peer);
} }
// try {
//
// // for (ConsensusPeer peer : ledgerPeers.values()) {
// for (Map.Entry<HashDigest, ConsensusPeer> entry : ledgerPeers.entrySet()) {
// HashDigest ledgerHash = entry.getKey();
// ConsensusPeer peer = entry.getValue();
// // TODO: 多线程启动;
// ConsensusNode[] nodes = peer.getConsensusRealm().getNodes();
// StringBuilder consensusInfo = new StringBuilder();
// for (ConsensusNode node : nodes) {
// consensusInfo.append(
// String.format("[%s]-%s; ", node.getAddress(),
// node.getConsensusAddress().toString()));
// }
// LOGGER.debug(String.format("-------- start consensus peer[Id=%s] --Nodes=%s
// -------------",
// peer.getCurrentId(), consensusInfo.toString()));
// peer.start();
// // 设置消息队列
// MsgQueueMessageDispatcher messageDispatcher = ledgerTxConverters.get(ledgerHash);
//
// if (messageDispatcher == null) {
// LedgerBindingConfig.BindingConfig bindingConfig =
// this.config.getLedger(ledgerHash);
// MQConnectionConfig mqConnection = bindingConfig.getMqConnection();
// if (mqConnection != null && mqConnection.getServer() != null) {
// MessageQueueConfig mqConfig = new
// MessageQueueConfig(mqConnection.getServer(),
// mqConnection.getTopic());
// messageDispatcher = MessageDispatcherFactory.newInstance(mqConfig, peer);
// Executors.newSingleThreadExecutor().execute(messageDispatcher); // 启动监听
// }
// }
// }
// } catch (Exception e) {
// LOGGER.error("Error occurred on starting all consensus realms! --" +
// e.getMessage(), e);
// throw new IllegalStateException(e.getMessage(), e);
// }
} }
@Override @Override


+ 14
- 8
source/peer/src/main/java/com/jd/blockchain/peer/web/PeerTimeTasks.java View File

@@ -15,11 +15,11 @@ import com.jd.blockchain.peer.ConsensusManage;
import com.jd.blockchain.peer.LedgerBindingConfigAware; import com.jd.blockchain.peer.LedgerBindingConfigAware;
import com.jd.blockchain.peer.PeerServerBooter; import com.jd.blockchain.peer.PeerServerBooter;
import com.jd.blockchain.tools.initializer.LedgerBindingConfig; import com.jd.blockchain.tools.initializer.LedgerBindingConfig;
import com.jd.blockchain.utils.ArgumentSet;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException; import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
@@ -38,9 +38,11 @@ import java.util.*;
* @since 1.0.0 * @since 1.0.0
*/ */
@Component @Component
//@EnableScheduling
@EnableScheduling
public class PeerTimeTasks implements ApplicationContextAware { public class PeerTimeTasks implements ApplicationContextAware {


private static Logger LOGGER = LoggerFactory.getLogger(PeerTimeTasks.class);

private ApplicationContext applicationContext; private ApplicationContext applicationContext;


@Autowired @Autowired
@@ -51,7 +53,9 @@ public class PeerTimeTasks implements ApplicationContextAware {
//每1分钟执行一次 //每1分钟执行一次
@Scheduled(cron = "0 */5 * * * * ") @Scheduled(cron = "0 */5 * * * * ")
public void updateLedger(){ public void updateLedger(){
System.out.println ("Update Ledger Tasks Start " + new Date());

LOGGER.debug("Time Task Update Ledger Tasks Start {}", new Date());

try { try {
LedgerBindingConfig ledgerBindingConfig = loadLedgerBindingConfig(); LedgerBindingConfig ledgerBindingConfig = loadLedgerBindingConfig();


@@ -78,7 +82,8 @@ public class PeerTimeTasks implements ApplicationContextAware {
Map<String, LedgerBindingConfigAware> bindingConfigAwares = applicationContext.getBeansOfType(LedgerBindingConfigAware.class); Map<String, LedgerBindingConfigAware> bindingConfigAwares = applicationContext.getBeansOfType(LedgerBindingConfigAware.class);
List<NodeServer> nodeServers = new ArrayList<>(); List<NodeServer> nodeServers = new ArrayList<>();
for (HashDigest ledgerHash : newAddHashs) { for (HashDigest ledgerHash : newAddHashs) {
System.out.printf("newLedger[%s] \r\n", ledgerHash.toBase58());

LOGGER.info("New Ledger [{}] Need To Be Init !!!", ledgerHash.toBase58());
for (LedgerBindingConfigAware aware : bindingConfigAwares.values()) { for (LedgerBindingConfigAware aware : bindingConfigAwares.values()) {
nodeServers.add(aware.setConfig(ledgerBindingConfig, ledgerHash)); nodeServers.add(aware.setConfig(ledgerBindingConfig, ledgerHash));
} }
@@ -89,10 +94,10 @@ public class PeerTimeTasks implements ApplicationContextAware {
consensusManage.runRealm(nodeServer); consensusManage.runRealm(nodeServer);
} }
} else { } else {
System.out.println("All Ledgers is newest!!!");
LOGGER.debug("All Ledgers is newest!!!");
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
LOGGER.error(e.getMessage());
} }
} }


@@ -104,7 +109,8 @@ public class PeerTimeTasks implements ApplicationContextAware {
private LedgerBindingConfig loadLedgerBindingConfig() throws Exception { private LedgerBindingConfig loadLedgerBindingConfig() throws Exception {
LedgerBindingConfig ledgerBindingConfig; LedgerBindingConfig ledgerBindingConfig;
ledgerBindConfigFile = PeerServerBooter.ledgerBindConfigFile; ledgerBindConfigFile = PeerServerBooter.ledgerBindConfigFile;
System.out.printf("load ledgerBindConfigFile = %s \r\n", ledgerBindConfigFile);
LOGGER.debug("Load LedgerBindConfigFile path = {}",
ledgerBindConfigFile == null ? "Default" : ledgerBindConfigFile);
if (ledgerBindConfigFile == null) { if (ledgerBindConfigFile == null) {
ClassPathResource configResource = new ClassPathResource("ledger-binding.conf"); ClassPathResource configResource = new ClassPathResource("ledger-binding.conf");
InputStream in = configResource.getInputStream(); InputStream in = configResource.getInputStream();


+ 3
- 20
source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/LedgerInitSettings.java View File

@@ -34,7 +34,7 @@ public class LedgerInitSettings {
/** /**
* 共识协议 * 共识协议
*/ */
private int consensusProtocol;
private String consensusProtocol;


/** /**
* 共识配置 * 共识配置
@@ -70,11 +70,11 @@ public class LedgerInitSettings {
this.cryptoSetting = cryptoSetting; this.cryptoSetting = cryptoSetting;
} }


public int getConsensusProtocol() {
public String getConsensusProtocol() {
return consensusProtocol; return consensusProtocol;
} }


public void setConsensusProtocol(int consensusProtocol) {
public void setConsensusProtocol(String consensusProtocol) {
this.consensusProtocol = consensusProtocol; this.consensusProtocol = consensusProtocol;
} }


@@ -93,21 +93,4 @@ public class LedgerInitSettings {
public void setParticipantNodes(ParticipantNode[] participantNodes) { public void setParticipantNodes(ParticipantNode[] participantNodes) {
this.participantNodes = participantNodes; this.participantNodes = participantNodes;
} }

public enum CONSENSUS_PROTOCOL {
UNKNOWN(0),
BFTSMART(1),
MSGQUEUE(2),
;

private int code;

CONSENSUS_PROTOCOL(int code) {
this.code = code;
}

public int code() {
return code;
}
}
} }

+ 5
- 0
source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/BlockchainServiceProxy.java View File

@@ -147,6 +147,11 @@ public abstract class BlockchainServiceProxy implements BlockchainService {
return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, keys); return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, keys);
} }


@Override
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, KVInfoVO kvInfoVO) {
return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, kvInfoVO);
}

@Override @Override
public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) { public KVDataEntry[] getDataEntries(HashDigest ledgerHash, String address, int fromIndex, int count) {
return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, fromIndex, count); return getQueryService(ledgerHash).getDataEntries(ledgerHash, address, fromIndex, count);


+ 6
- 1
source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/proxy/HttpBlockchainQueryService.java View File

@@ -496,7 +496,11 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService
@PathParam(name="address") String address, @PathParam(name="address") String address,
@RequestParam(name="keys", array = true) String... keys); @RequestParam(name="keys", array = true) String... keys);


@HttpAction(method = HttpMethod.POST, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
@HttpAction(method=HttpMethod.POST, path="ledgers/{ledgerHash}/accounts/{address}/entries-version")
@Override
KVDataEntry[] getDataEntries(@PathParam(name="ledgerHash", converter=HashDigestToStringConverter.class) HashDigest ledgerHash,
@PathParam(name="address") String address,
@RequestBody KVInfoVO kvInfoVO);


/** /**
* 返回数据账户中指定序号的最新值; * 返回数据账户中指定序号的最新值;
@@ -513,6 +517,7 @@ public interface HttpBlockchainQueryService extends BlockchainExtendQueryService
* 如果参数值为 -1,则返回全部的记录;<br> * 如果参数值为 -1,则返回全部的记录;<br>
* @return * @return
*/ */
@HttpAction(method = HttpMethod.POST, path = "ledgers/{ledgerHash}/accounts/address/{address}/entries")
@Override @Override
KVDataEntry[] getDataEntries(@PathParam(name = "ledgerHash") HashDigest ledgerHash, KVDataEntry[] getDataEntries(@PathParam(name = "ledgerHash") HashDigest ledgerHash,
@PathParam(name = "address") String address, @PathParam(name = "address") String address,


+ 0
- 1
source/test/pom.xml View File

@@ -15,7 +15,6 @@
<module>test-consensus-node</module> <module>test-consensus-node</module>
<module>test-ledger-core</module> <module>test-ledger-core</module>
<module>test-integration</module> <module>test-integration</module>
<module>test-stp-community</module>
</modules> </modules>
<build> <build>


+ 4
- 6
source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/PresetAnswerPrompter.java View File

@@ -7,13 +7,13 @@ import com.jd.blockchain.tools.initializer.ConsolePrompter;
public class PresetAnswerPrompter extends ConsolePrompter { public class PresetAnswerPrompter extends ConsolePrompter {


private Properties answers = new Properties(); private Properties answers = new Properties();
private String defaultAnswer; private String defaultAnswer;
public PresetAnswerPrompter(String defaultAnswer) { public PresetAnswerPrompter(String defaultAnswer) {
this.defaultAnswer = defaultAnswer; this.defaultAnswer = defaultAnswer;
} }
public void setAnswer(String tag, String answer) { public void setAnswer(String tag, String answer) {
answers.setProperty(tag, answer); answers.setProperty(tag, answer);
} }
@@ -21,7 +21,7 @@ public class PresetAnswerPrompter extends ConsolePrompter {
public void setDefaultAnswer(String defaultAnswer) { public void setDefaultAnswer(String defaultAnswer) {
this.defaultAnswer = defaultAnswer; this.defaultAnswer = defaultAnswer;
} }
@Override @Override
public String confirm(String tag, String format, Object... args) { public String confirm(String tag, String format, Object... args) {
System.out.print(String.format(format, args)); System.out.print(String.format(format, args));
@@ -29,7 +29,5 @@ public class PresetAnswerPrompter extends ConsolePrompter {
System.out.println(String.format("\r\n [Mocked answer:%s]", answer)); System.out.println(String.format("\r\n [Mocked answer:%s]", answer));
return answer; return answer;
} }


} }

+ 12
- 13
source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/consensus/ConsensusTest.java View File

@@ -215,26 +215,26 @@ public class ConsensusTest {
DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri("memory://local/0"); testDb0.setConnectionUri("memory://local/0");
LedgerBindingConfig bindingConfig0 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig0 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback0 = nodeCtx0.startInitCommand(privkey0, encodedPassword, initSetting, csProps,csProvider,
testDb0, consolePrompter, bindingConfig0, quitLatch);
AsyncCallback<HashDigest> callback0 = nodeCtx0.startInitCommand(privkey0, encodedPassword, initSetting, csProps,
csProvider, testDb0, consolePrompter, bindingConfig0, quitLatch);


DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri("memory://local/1"); testDb1.setConnectionUri("memory://local/1");
LedgerBindingConfig bindingConfig1 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig1 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback1 = nodeCtx1.startInitCommand(privkey1, encodedPassword, initSetting, csProps,csProvider,
testDb1, consolePrompter, bindingConfig1, quitLatch);
AsyncCallback<HashDigest> callback1 = nodeCtx1.startInitCommand(privkey1, encodedPassword, initSetting, csProps,
csProvider, testDb1, consolePrompter, bindingConfig1, quitLatch);


DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri("memory://local/2"); testDb2.setConnectionUri("memory://local/2");
LedgerBindingConfig bindingConfig2 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig2 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback2 = nodeCtx2.startInitCommand(privkey2, encodedPassword, initSetting, csProps,csProvider,
testDb2, consolePrompter, bindingConfig2, quitLatch);
AsyncCallback<HashDigest> callback2 = nodeCtx2.startInitCommand(privkey2, encodedPassword, initSetting, csProps,
csProvider, testDb2, consolePrompter, bindingConfig2, quitLatch);


DBConnectionConfig testDb3 = new DBConnectionConfig(); DBConnectionConfig testDb3 = new DBConnectionConfig();
testDb3.setConnectionUri("memory://local/3"); testDb3.setConnectionUri("memory://local/3");
LedgerBindingConfig bindingConfig3 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig3 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback3 = nodeCtx3.startInitCommand(privkey3, encodedPassword, initSetting, csProps,csProvider,
testDb3, consolePrompter, bindingConfig3, quitLatch);
AsyncCallback<HashDigest> callback3 = nodeCtx3.startInitCommand(privkey3, encodedPassword, initSetting, csProps,
csProvider, testDb3, consolePrompter, bindingConfig3, quitLatch);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();
@@ -354,8 +354,8 @@ public class ConsensusTest {
} }


public AsyncCallback<HashDigest> startInit(PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig, Prompter prompter,
CountDownLatch quitLatch) {
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, CountDownLatch quitLatch) {


ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
@@ -364,7 +364,7 @@ public class ConsensusTest {


// NodeWebContext.this.initProcess = ctx.getBean(LedgerInitProcess.class); // NodeWebContext.this.initProcess = ctx.getBean(LedgerInitProcess.class);
NodeInitContext.this.dbConnConfig = dbConnConfig; NodeInitContext.this.dbConnConfig = dbConnConfig;
HashDigest ledgerHash = NodeInitContext.this.initProcess.initialize(id, privKey, setting, csProps, csProvider,
HashDigest ledgerHash = NodeInitContext.this.initProcess.initialize(id, privKey, setting,
dbConnConfig, prompter); dbConnConfig, prompter);


quitLatch.countDown(); quitLatch.countDown();
@@ -386,8 +386,7 @@ public class ConsensusTest {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
LedgerInitCommand initCmd = new LedgerInitCommand(); LedgerInitCommand initCmd = new LedgerInitCommand();
HashDigest ledgerHash = initCmd.startInit(id, privKey, base58Pwd, ledgerSetting, csProps,
csProvider, dbConnConfig, prompter, conf, db);
HashDigest ledgerHash = initCmd.startInit(id, privKey, base58Pwd, ledgerSetting, dbConnConfig, prompter, conf, db);
NodeInitContext.this.ledgerManager = initCmd.getLedgerManager(); NodeInitContext.this.ledgerManager = initCmd.getLedgerManager();
quitLatch.countDown(); quitLatch.countDown();
return ledgerHash; return ledgerHash;


+ 5
- 5
source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/GlobalPerformanceTest.java View File

@@ -187,7 +187,7 @@ public class GlobalPerformanceTest {
Properties props = Utils.loadConsensusSetting(); Properties props = Utils.loadConsensusSetting();
ConsensusProvider csProvider = getConsensusProvider(); ConsensusProvider csProvider = getConsensusProvider();
ConsensusSettings csProps = csProvider.getSettingsFactory().getConsensusSettingsBuilder().createSettings(props); ConsensusSettings csProps = csProvider.getSettingsFactory().getConsensusSettingsBuilder().createSettings(props);
// 启动服务器; // 启动服务器;
NetworkAddress initAddr0 = initSetting.getConsensusParticipant(0).getInitializerAddress(); NetworkAddress initAddr0 = initSetting.getConsensusParticipant(0).getInitializerAddress();
NodeInitContext nodeCtx0 = new NodeInitContext(0, initAddr0); NodeInitContext nodeCtx0 = new NodeInitContext(0, initAddr0);
@@ -365,8 +365,8 @@ public class GlobalPerformanceTest {


// NodeWebContext.this.initProcess = ctx.getBean(LedgerInitProcess.class); // NodeWebContext.this.initProcess = ctx.getBean(LedgerInitProcess.class);
NodeInitContext.this.dbConnConfig = dbConnConfig; NodeInitContext.this.dbConnConfig = dbConnConfig;
HashDigest ledgerHash = NodeInitContext.this.initProcess.initialize(id, privKey, setting, csProps,
csProvider, dbConnConfig, prompter);
HashDigest ledgerHash = NodeInitContext.this.initProcess.initialize(id, privKey, setting,
dbConnConfig, prompter);


quitLatch.countDown(); quitLatch.countDown();
return ledgerHash; return ledgerHash;
@@ -387,8 +387,8 @@ public class GlobalPerformanceTest {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
LedgerInitCommand initCmd = new LedgerInitCommand(); LedgerInitCommand initCmd = new LedgerInitCommand();
HashDigest ledgerHash = initCmd.startInit(id, privKey, base58Pwd, ledgerSetting, csProps,
csProvider, dbConnConfig, prompter, conf, db);
HashDigest ledgerHash = initCmd.startInit(id, privKey, base58Pwd, ledgerSetting, dbConnConfig,
prompter, conf, db);
NodeInitContext.this.ledgerManager = initCmd.getLedgerManager(); NodeInitContext.this.ledgerManager = initCmd.getLedgerManager();
quitLatch.countDown(); quitLatch.countDown();
return ledgerHash; return ledgerHash;


+ 12
- 22
source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerInitializeTest.java View File

@@ -68,9 +68,6 @@ public class LedgerInitializeTest {
public void testInitWith4Nodes() { public void testInitWith4Nodes() {
Prompter consolePrompter = new PresetAnswerPrompter("N"); // new ConsolePrompter(); Prompter consolePrompter = new PresetAnswerPrompter("N"); // new ConsolePrompter();
LedgerInitProperties initSetting = loadInitSetting(); LedgerInitProperties initSetting = loadInitSetting();
Properties props = loadConsensusSetting();
ConsensusProvider csProvider = getConsensusProvider();
ConsensusSettings csProps = csProvider.getSettingsFactory().getConsensusSettingsBuilder().createSettings(props);


NodeContext node0 = new NodeContext(initSetting.getConsensusParticipant(0).getInitializerAddress(), NodeContext node0 = new NodeContext(initSetting.getConsensusParticipant(0).getInitializerAddress(),
serviceRegisterMap); serviceRegisterMap);
@@ -81,31 +78,28 @@ public class LedgerInitializeTest {
NodeContext node3 = new NodeContext(initSetting.getConsensusParticipant(3).getInitializerAddress(), NodeContext node3 = new NodeContext(initSetting.getConsensusParticipant(3).getInitializerAddress(),
serviceRegisterMap); serviceRegisterMap);


String[] memoryConnString = new String[]{"memory://local/0", "memory://local/1", "memory://local/2", "memory://local/3"};
String[] memoryConnString = new String[] { "memory://local/0", "memory://local/1", "memory://local/2",
"memory://local/3" };


PrivKey privkey0 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[0], PASSWORD); PrivKey privkey0 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[0], PASSWORD);
DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri(memoryConnString[0]); testDb0.setConnectionUri(memoryConnString[0]);
AsyncCallback<HashDigest> callback0 = node0.startInit(0, privkey0, initSetting, csProps, csProvider, testDb0,
consolePrompter);
AsyncCallback<HashDigest> callback0 = node0.startInit(0, privkey0, initSetting, testDb0, consolePrompter);


PrivKey privkey1 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[1], PASSWORD); PrivKey privkey1 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[1], PASSWORD);
DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri(memoryConnString[1]); testDb1.setConnectionUri(memoryConnString[1]);
AsyncCallback<HashDigest> callback1 = node1.startInit(1, privkey1, initSetting, csProps, csProvider, testDb1,
consolePrompter);
AsyncCallback<HashDigest> callback1 = node1.startInit(1, privkey1, initSetting, testDb1, consolePrompter);


PrivKey privkey2 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[2], PASSWORD); PrivKey privkey2 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[2], PASSWORD);
DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri(memoryConnString[2]); testDb2.setConnectionUri(memoryConnString[2]);
AsyncCallback<HashDigest> callback2 = node2.startInit(2, privkey2, initSetting, csProps, csProvider, testDb2,
consolePrompter);
AsyncCallback<HashDigest> callback2 = node2.startInit(2, privkey2, initSetting, testDb2, consolePrompter);


PrivKey privkey3 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[3], PASSWORD); PrivKey privkey3 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[3], PASSWORD);
DBConnectionConfig testDb03 = new DBConnectionConfig(); DBConnectionConfig testDb03 = new DBConnectionConfig();
testDb03.setConnectionUri(memoryConnString[3]); testDb03.setConnectionUri(memoryConnString[3]);
AsyncCallback<HashDigest> callback3 = node3.startInit(3, privkey3, initSetting, csProps, csProvider, testDb03,
consolePrompter);
AsyncCallback<HashDigest> callback3 = node3.startInit(3, privkey3, initSetting, testDb03, consolePrompter);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();
@@ -188,23 +182,21 @@ public class LedgerInitializeTest {


public NodeContext(NetworkAddress address, Map<NetworkAddress, LedgerInitConsensusService> serviceRegisterMap) { public NodeContext(NetworkAddress address, Map<NetworkAddress, LedgerInitConsensusService> serviceRegisterMap) {
this.initCsServiceFactory = new MultiThreadInterInvokerFactory(serviceRegisterMap); this.initCsServiceFactory = new MultiThreadInterInvokerFactory(serviceRegisterMap);
LedgerInitializeWebController initController = new LedgerInitializeWebController(ledgerManager, memoryDBConnFactory,
initCsServiceFactory);
LedgerInitializeWebController initController = new LedgerInitializeWebController(ledgerManager,
memoryDBConnFactory, initCsServiceFactory);
serviceRegisterMap.put(address, initController); serviceRegisterMap.put(address, initController);
this.initProcess = initController; this.initProcess = initController;
} }


public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter) {
DBConnectionConfig dbConnConfig, Prompter prompter) {


partiKey = new AsymmetricKeypair(setting.getConsensusParticipant(0).getPubKey(), privKey); partiKey = new AsymmetricKeypair(setting.getConsensusParticipant(0).getPubKey(), privKey);


ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
return initProcess.initialize(currentId, privKey, setting, csProps, csProvider, dbConnConfig,
prompter);
return initProcess.initialize(currentId, privKey, setting, dbConnConfig, prompter);
} }
}; };


@@ -212,8 +204,7 @@ public class LedgerInitializeTest {
} }


public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, boolean autoVerifyHash) {
DBConnectionConfig dbConnConfig, Prompter prompter, boolean autoVerifyHash) {


CryptoConfig cryptoSetting = new CryptoConfig(); CryptoConfig cryptoSetting = new CryptoConfig();
cryptoSetting.setAutoVerifyHash(autoVerifyHash); cryptoSetting.setAutoVerifyHash(autoVerifyHash);
@@ -224,8 +215,7 @@ public class LedgerInitializeTest {
ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
return initProcess.initialize(currentId, privKey, setting, csProps, csProvider, dbConnConfig,
prompter, cryptoSetting);
return initProcess.initialize(currentId, privKey, setting, dbConnConfig, prompter, cryptoSetting);
} }
}; };




+ 13
- 14
source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerInitializeWebTest.java View File

@@ -264,23 +264,23 @@ public class LedgerInitializeWebTest {


DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri("memory://local/0"); testDb0.setConnectionUri("memory://local/0");
AsyncCallback<HashDigest> callback0 = node0.startInit(privkey0, initSetting, csProps, csProvider, testDb0,
consolePrompter, quitLatch);
AsyncCallback<HashDigest> callback0 = node0.startInit(privkey0, initSetting, testDb0, consolePrompter,
quitLatch);


DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri("memory://local/1"); testDb1.setConnectionUri("memory://local/1");
AsyncCallback<HashDigest> callback1 = node1.startInit(privkey1, initSetting, csProps, csProvider, testDb1,
consolePrompter, quitLatch);
AsyncCallback<HashDigest> callback1 = node1.startInit(privkey1, initSetting, testDb1, consolePrompter,
quitLatch);


DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri("memory://local/2"); testDb2.setConnectionUri("memory://local/2");
AsyncCallback<HashDigest> callback2 = node2.startInit(privkey2, initSetting, csProps, csProvider, testDb2,
consolePrompter, quitLatch);
AsyncCallback<HashDigest> callback2 = node2.startInit(privkey2, initSetting, testDb2, consolePrompter,
quitLatch);


DBConnectionConfig testDb03 = new DBConnectionConfig(); DBConnectionConfig testDb03 = new DBConnectionConfig();
testDb03.setConnectionUri("memory://local/3"); testDb03.setConnectionUri("memory://local/3");
AsyncCallback<HashDigest> callback3 = node3.startInit(privkey3, initSetting, csProps, csProvider, testDb03,
consolePrompter, quitLatch);
AsyncCallback<HashDigest> callback3 = node3.startInit(privkey3, initSetting, testDb03, consolePrompter,
quitLatch);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();
@@ -402,8 +402,7 @@ public class LedgerInitializeWebTest {
} }


public AsyncCallback<HashDigest> startInit(PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, CountDownLatch quitLatch) {
DBConnectionConfig dbConnConfig, Prompter prompter, CountDownLatch quitLatch) {


ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
@@ -412,8 +411,8 @@ public class LedgerInitializeWebTest {


// NodeWebContext.this.initProcess = ctx.getBean(LedgerInitProcess.class); // NodeWebContext.this.initProcess = ctx.getBean(LedgerInitProcess.class);
NodeWebContext.this.dbConnConfig = dbConnConfig; NodeWebContext.this.dbConnConfig = dbConnConfig;
HashDigest ledgerHash = NodeWebContext.this.initProcess.initialize(id, privKey, setting, csProps,
csProvider, dbConnConfig, prompter);
HashDigest ledgerHash = NodeWebContext.this.initProcess.initialize(id, privKey, setting,
dbConnConfig, prompter);


quitLatch.countDown(); quitLatch.countDown();
return ledgerHash; return ledgerHash;
@@ -443,8 +442,8 @@ public class LedgerInitializeWebTest {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
LedgerInitCommand initCmd = new LedgerInitCommand(); LedgerInitCommand initCmd = new LedgerInitCommand();
HashDigest ledgerHash = initCmd.startInit(id, privKey, base58Pwd, ledgerSetting, csProps,
csProvider, dbConnConfig, prompter, conf, db);
HashDigest ledgerHash = initCmd.startInit(id, privKey, base58Pwd, ledgerSetting, dbConnConfig,
prompter, conf, db);
NodeWebContext.this.ledgerManager = initCmd.getLedgerManager(); NodeWebContext.this.ledgerManager = initCmd.getLedgerManager();
quitLatch.countDown(); quitLatch.countDown();
return ledgerHash; return ledgerHash;


+ 3
- 6
source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java View File

@@ -106,16 +106,14 @@ public class Utils {
} }


public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider consensusProvider, DBConnectionConfig dbConnConfig,
Prompter prompter) {
DBConnectionConfig dbConnConfig, Prompter prompter) {


partiKey = new AsymmetricKeypair(setting.getConsensusParticipant(0).getPubKey(), privKey); partiKey = new AsymmetricKeypair(setting.getConsensusParticipant(0).getPubKey(), privKey);


ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
return initProcess.initialize(currentId, privKey, setting, csProps, consensusProvider, dbConnConfig,
prompter);
return initProcess.initialize(currentId, privKey, setting, dbConnConfig, prompter);
} }
}; };


@@ -150,8 +148,7 @@ public class Utils {
ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
return initProcess.initialize(currentId, privKey, setting, csProps, consensusProvider, dbConnConfig,
prompter, cryptoSetting);
return initProcess.initialize(currentId, privKey, setting, dbConnConfig, prompter, cryptoSetting);
} }
}; };




+ 23
- 20
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBaseTest.java View File

@@ -1,7 +1,16 @@
package test.com.jd.blockchain.intgr; package test.com.jd.blockchain.intgr;


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;

import org.springframework.core.io.ClassPathResource;

import com.jd.blockchain.consensus.ConsensusProvider; import com.jd.blockchain.consensus.ConsensusProvider;
import com.jd.blockchain.consensus.ConsensusProviders;
import com.jd.blockchain.consensus.ConsensusSettings; import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
@@ -9,27 +18,21 @@ import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.gateway.GatewayConfigProperties.KeyPairConfig; import com.jd.blockchain.gateway.GatewayConfigProperties.KeyPairConfig;
import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.core.LedgerRepository; import com.jd.blockchain.ledger.core.LedgerRepository;
import com.jd.blockchain.tools.initializer.*;
import com.jd.blockchain.tools.initializer.DBConnectionConfig;
import com.jd.blockchain.tools.initializer.LedgerBindingConfig;
import com.jd.blockchain.tools.initializer.LedgerInitProperties;
import com.jd.blockchain.tools.initializer.Prompter;
import com.jd.blockchain.tools.keygen.KeyGenCommand; import com.jd.blockchain.tools.keygen.KeyGenCommand;
import com.jd.blockchain.utils.concurrent.ThreadInvoker.AsyncCallback; import com.jd.blockchain.utils.concurrent.ThreadInvoker.AsyncCallback;
import com.jd.blockchain.utils.net.NetworkAddress; import com.jd.blockchain.utils.net.NetworkAddress;


import org.springframework.core.io.ClassPathResource;
import test.com.jd.blockchain.intgr.IntegratedContext.Node; import test.com.jd.blockchain.intgr.IntegratedContext.Node;
import test.com.jd.blockchain.intgr.initializer.LedgerInitializeWeb4SingleStepsTest; import test.com.jd.blockchain.intgr.initializer.LedgerInitializeWeb4SingleStepsTest;
import test.com.jd.blockchain.intgr.initializer.LedgerInitializeWeb4SingleStepsTest.NodeWebContext; import test.com.jd.blockchain.intgr.initializer.LedgerInitializeWeb4SingleStepsTest.NodeWebContext;


import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

public class IntegrationBaseTest { public class IntegrationBaseTest {


LedgerInitConsensusConfig.ConsensusConfig bftsmartConfig = LedgerInitConsensusConfig.bftsmartConfig;
LedgerInitConsensusConfig.ConsensusConfig bftsmartConfig = LedgerInitConsensusConfig.bftsmartConfig;


public IntegratedContext context = initLedgers(bftsmartConfig.getConfigPath(), bftsmartConfig.getProvider()); public IntegratedContext context = initLedgers(bftsmartConfig.getConfigPath(), bftsmartConfig.getProvider());
public GatewayTestRunner gateway0; public GatewayTestRunner gateway0;
@@ -150,26 +153,26 @@ public class IntegrationBaseTest {
DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri(LedgerInitConsensusConfig.memConnectionStrings[0]); testDb0.setConnectionUri(LedgerInitConsensusConfig.memConnectionStrings[0]);
LedgerBindingConfig bindingConfig0 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig0 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback0 = nodeCtx0.startInitCommand(privkey0, encodedPassword, initSetting, csProps,
csProvider, testDb0, consolePrompter, bindingConfig0, quitLatch);
AsyncCallback<HashDigest> callback0 = nodeCtx0.startInitCommand(privkey0, encodedPassword, initSetting, testDb0,
consolePrompter, bindingConfig0, quitLatch);


DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri(LedgerInitConsensusConfig.memConnectionStrings[1]); testDb1.setConnectionUri(LedgerInitConsensusConfig.memConnectionStrings[1]);
LedgerBindingConfig bindingConfig1 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig1 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback1 = nodeCtx1.startInitCommand(privkey1, encodedPassword, initSetting, csProps,
csProvider, testDb1, consolePrompter, bindingConfig1, quitLatch);
AsyncCallback<HashDigest> callback1 = nodeCtx1.startInitCommand(privkey1, encodedPassword, initSetting, testDb1,
consolePrompter, bindingConfig1, quitLatch);


DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri(LedgerInitConsensusConfig.memConnectionStrings[2]); testDb2.setConnectionUri(LedgerInitConsensusConfig.memConnectionStrings[2]);
LedgerBindingConfig bindingConfig2 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig2 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback2 = nodeCtx2.startInitCommand(privkey2, encodedPassword, initSetting, csProps,
csProvider, testDb2, consolePrompter, bindingConfig2, quitLatch);
AsyncCallback<HashDigest> callback2 = nodeCtx2.startInitCommand(privkey2, encodedPassword, initSetting, testDb2,
consolePrompter, bindingConfig2, quitLatch);


DBConnectionConfig testDb3 = new DBConnectionConfig(); DBConnectionConfig testDb3 = new DBConnectionConfig();
testDb3.setConnectionUri(LedgerInitConsensusConfig.memConnectionStrings[3]); testDb3.setConnectionUri(LedgerInitConsensusConfig.memConnectionStrings[3]);
LedgerBindingConfig bindingConfig3 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig3 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback3 = nodeCtx3.startInitCommand(privkey3, encodedPassword, initSetting, csProps,
csProvider, testDb3, consolePrompter, bindingConfig3, quitLatch);
AsyncCallback<HashDigest> callback3 = nodeCtx3.startInitCommand(privkey3, encodedPassword, initSetting, testDb3,
consolePrompter, bindingConfig3, quitLatch);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();


+ 16
- 18
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest2.java View File

@@ -57,7 +57,7 @@ public class IntegrationTest2 {
public void test() { public void test() {
// init ledgers of all nodes ; // init ledgers of all nodes ;
IntegratedContext context = initLedgers(LedgerInitConsensusConfig.mqConfig, IntegratedContext context = initLedgers(LedgerInitConsensusConfig.mqConfig,
LedgerInitConsensusConfig.memConnectionStrings);
LedgerInitConsensusConfig.memConnectionStrings);
Node node0 = context.getNode(0); Node node0 = context.getNode(0);
Node node1 = context.getNode(1); Node node1 = context.getNode(1);
Node node2 = context.getNode(2); Node node2 = context.getNode(2);
@@ -70,10 +70,10 @@ public class IntegrationTest2 {
PeerTestRunner peer1 = new PeerTestRunner(peerSrvAddr1, node1.getBindingConfig(), node1.getStorageDB()); PeerTestRunner peer1 = new PeerTestRunner(peerSrvAddr1, node1.getBindingConfig(), node1.getStorageDB());


NetworkAddress peerSrvAddr2 = new NetworkAddress("127.0.0.1", 13220); NetworkAddress peerSrvAddr2 = new NetworkAddress("127.0.0.1", 13220);
PeerTestRunner peer2 = new PeerTestRunner(peerSrvAddr2,node2.getBindingConfig(), node2.getStorageDB());
PeerTestRunner peer2 = new PeerTestRunner(peerSrvAddr2, node2.getBindingConfig(), node2.getStorageDB());


NetworkAddress peerSrvAddr3 = new NetworkAddress("127.0.0.1", 13230); NetworkAddress peerSrvAddr3 = new NetworkAddress("127.0.0.1", 13230);
PeerTestRunner peer3 = new PeerTestRunner(peerSrvAddr3,node3.getBindingConfig(), node3.getStorageDB());
PeerTestRunner peer3 = new PeerTestRunner(peerSrvAddr3, node3.getBindingConfig(), node3.getStorageDB());


AsyncCallback<Object> peerStarting0 = peer0.start(); AsyncCallback<Object> peerStarting0 = peer0.start();
AsyncCallback<Object> peerStarting1 = peer1.start(); AsyncCallback<Object> peerStarting1 = peer1.start();
@@ -192,26 +192,26 @@ public class IntegrationTest2 {
DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri(dbConns[0]); testDb0.setConnectionUri(dbConns[0]);
LedgerBindingConfig bindingConfig0 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig0 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback0 = nodeCtx0.startInitCommand(privkey0, encodedPassword, initSetting, csProps, csProvider,
testDb0, consolePrompter, bindingConfig0, quitLatch);
AsyncCallback<HashDigest> callback0 = nodeCtx0.startInitCommand(privkey0, encodedPassword, initSetting, testDb0,
consolePrompter, bindingConfig0, quitLatch);


DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri(dbConns[1]); testDb1.setConnectionUri(dbConns[1]);
LedgerBindingConfig bindingConfig1 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig1 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback1 = nodeCtx1.startInitCommand(privkey1, encodedPassword, initSetting, csProps,csProvider,
testDb1, consolePrompter, bindingConfig1, quitLatch);
AsyncCallback<HashDigest> callback1 = nodeCtx1.startInitCommand(privkey1, encodedPassword, initSetting, testDb1,
consolePrompter, bindingConfig1, quitLatch);


DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri(dbConns[2]); testDb2.setConnectionUri(dbConns[2]);
LedgerBindingConfig bindingConfig2 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig2 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback2 = nodeCtx2.startInitCommand(privkey2, encodedPassword, initSetting, csProps,csProvider,
testDb2, consolePrompter, bindingConfig2, quitLatch);
AsyncCallback<HashDigest> callback2 = nodeCtx2.startInitCommand(privkey2, encodedPassword, initSetting, testDb2,
consolePrompter, bindingConfig2, quitLatch);


DBConnectionConfig testDb3 = new DBConnectionConfig(); DBConnectionConfig testDb3 = new DBConnectionConfig();
testDb3.setConnectionUri(dbConns[3]); testDb3.setConnectionUri(dbConns[3]);
LedgerBindingConfig bindingConfig3 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig3 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback3 = nodeCtx3.startInitCommand(privkey3, encodedPassword, initSetting, csProps,csProvider,
testDb3, consolePrompter, bindingConfig3, quitLatch);
AsyncCallback<HashDigest> callback3 = nodeCtx3.startInitCommand(privkey3, encodedPassword, initSetting, testDb3,
consolePrompter, bindingConfig3, quitLatch);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();
@@ -286,7 +286,7 @@ public class IntegrationTest2 {
} }


private void testSDK_Contract(AsymmetricKeypair adminKey, HashDigest ledgerHash, private void testSDK_Contract(AsymmetricKeypair adminKey, HashDigest ledgerHash,
BlockchainService blockchainService, IntegratedContext context) {
BlockchainService blockchainService, IntegratedContext context) {
BlockchainKeypair userKey = BlockchainKeyGenerator.getInstance().generate(); BlockchainKeypair userKey = BlockchainKeyGenerator.getInstance().generate();


// 定义交易; // 定义交易;
@@ -304,19 +304,18 @@ public class IntegrationTest2 {
assertTrue(txResp.isSuccess()); assertTrue(txResp.isSuccess());


// execute the contract; // execute the contract;
testContractExe(adminKey, ledgerHash, userKey, blockchainService, context);
testContractExe(adminKey, ledgerHash, userKey, blockchainService, context);
} }


private void testContractExe(AsymmetricKeypair adminKey, HashDigest ledgerHash, BlockchainKeypair userKey, private void testContractExe(AsymmetricKeypair adminKey, HashDigest ledgerHash, BlockchainKeypair userKey,
BlockchainService blockchainService, IntegratedContext context) {
BlockchainService blockchainService, IntegratedContext context) {
LedgerInfo ledgerInfo = blockchainService.getLedger(ledgerHash); LedgerInfo ledgerInfo = blockchainService.getLedger(ledgerHash);
LedgerBlock previousBlock = blockchainService.getBlock(ledgerHash, ledgerInfo.getLatestBlockHeight()-1);
LedgerBlock previousBlock = blockchainService.getBlock(ledgerHash, ledgerInfo.getLatestBlockHeight() - 1);


// 定义交易; // 定义交易;
TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash);


txTpl.contractEvents().send(contractDeployKey.getAddress(), eventName,
("888##999##abc").getBytes());
txTpl.contractEvents().send(contractDeployKey.getAddress(), eventName, ("888##999##abc").getBytes());


// 签名; // 签名;
PreparedTransaction ptx = txTpl.prepare(); PreparedTransaction ptx = txTpl.prepare();
@@ -327,7 +326,6 @@ public class IntegrationTest2 {
assertTrue(txResp.isSuccess()); assertTrue(txResp.isSuccess());
} }



/** /**
* 根据合约构建字节数组; * 根据合约构建字节数组;
* *


+ 14
- 14
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTestDataAccount.java View File

@@ -8,13 +8,11 @@ import java.io.InputStream;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;


import com.jd.blockchain.storage.service.DbConnection;
import org.junit.Test; import org.junit.Test;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;


import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.jd.blockchain.consensus.ConsensusProvider; import com.jd.blockchain.consensus.ConsensusProvider;
import com.jd.blockchain.consensus.ConsensusProviders;
import com.jd.blockchain.consensus.ConsensusSettings; import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
@@ -34,6 +32,7 @@ import com.jd.blockchain.ledger.core.LedgerRepository;
import com.jd.blockchain.ledger.core.impl.LedgerManager; import com.jd.blockchain.ledger.core.impl.LedgerManager;
import com.jd.blockchain.sdk.BlockchainService; import com.jd.blockchain.sdk.BlockchainService;
import com.jd.blockchain.sdk.client.GatewayServiceFactory; import com.jd.blockchain.sdk.client.GatewayServiceFactory;
import com.jd.blockchain.storage.service.DbConnection;
import com.jd.blockchain.tools.initializer.DBConnectionConfig; import com.jd.blockchain.tools.initializer.DBConnectionConfig;
import com.jd.blockchain.tools.initializer.LedgerBindingConfig; import com.jd.blockchain.tools.initializer.LedgerBindingConfig;
import com.jd.blockchain.tools.initializer.LedgerInitProperties; import com.jd.blockchain.tools.initializer.LedgerInitProperties;
@@ -50,7 +49,7 @@ import test.com.jd.blockchain.intgr.initializer.LedgerInitializeWeb4SingleStepsT


public class IntegrationTestDataAccount { public class IntegrationTestDataAccount {


LedgerInitConsensusConfig.ConsensusConfig config = LedgerInitConsensusConfig.mqConfig;
LedgerInitConsensusConfig.ConsensusConfig config = LedgerInitConsensusConfig.mqConfig;


public IntegratedContext context = initLedgers(config, LedgerInitConsensusConfig.memConnectionStrings); public IntegratedContext context = initLedgers(config, LedgerInitConsensusConfig.memConnectionStrings);
public GatewayTestRunner gateway0; public GatewayTestRunner gateway0;
@@ -173,8 +172,8 @@ public class IntegrationTestDataAccount {
} }


// 通过调用SDK->GATEWAY,测试一个区块包含多个交易时的写入情况,并验证写入结果; // 通过调用SDK->GATEWAY,测试一个区块包含多个交易时的写入情况,并验证写入结果;
private void testAddKvOpToDataAccount(GatewayTestRunner gateway, AsymmetricKeypair adminKey, IntegratedContext context,
Bytes dataAddr) {
private void testAddKvOpToDataAccount(GatewayTestRunner gateway, AsymmetricKeypair adminKey,
IntegratedContext context, Bytes dataAddr) {


GatewayServiceFactory gwsrvFact = GatewayServiceFactory.connect(gateway.getServiceAddress()); GatewayServiceFactory gwsrvFact = GatewayServiceFactory.connect(gateway.getServiceAddress());
BlockchainService blockchainService = gwsrvFact.getBlockchainService(); BlockchainService blockchainService = gwsrvFact.getBlockchainService();
@@ -182,7 +181,8 @@ public class IntegrationTestDataAccount {


LedgerManager ledgerManager = context.getNode(0).getLedgerManager(); LedgerManager ledgerManager = context.getNode(0).getLedgerManager();


DbConnection memoryBasedDb = context.getNode(0).getStorageDB().connect(LedgerInitConsensusConfig.memConnectionStrings[0]);
DbConnection memoryBasedDb = context.getNode(0).getStorageDB()
.connect(LedgerInitConsensusConfig.memConnectionStrings[0]);


LedgerRepository ledgerRepository = ledgerManager.register(ledgerHashs[0], memoryBasedDb.getStorageService()); LedgerRepository ledgerRepository = ledgerManager.register(ledgerHashs[0], memoryBasedDb.getStorageService());


@@ -288,26 +288,26 @@ public class IntegrationTestDataAccount {
DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri(dbConns[0]); testDb0.setConnectionUri(dbConns[0]);
LedgerBindingConfig bindingConfig0 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig0 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback0 = nodeCtx0.startInitCommand(privkey0, encodedPassword, initSetting, csProps,
csProvider, testDb0, consolePrompter, bindingConfig0, quitLatch);
AsyncCallback<HashDigest> callback0 = nodeCtx0.startInitCommand(privkey0, encodedPassword, initSetting, testDb0,
consolePrompter, bindingConfig0, quitLatch);


DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri(dbConns[1]); testDb1.setConnectionUri(dbConns[1]);
LedgerBindingConfig bindingConfig1 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig1 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback1 = nodeCtx1.startInitCommand(privkey1, encodedPassword, initSetting, csProps,
csProvider, testDb1, consolePrompter, bindingConfig1, quitLatch);
AsyncCallback<HashDigest> callback1 = nodeCtx1.startInitCommand(privkey1, encodedPassword, initSetting, testDb1,
consolePrompter, bindingConfig1, quitLatch);


DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri(dbConns[2]); testDb2.setConnectionUri(dbConns[2]);
LedgerBindingConfig bindingConfig2 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig2 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback2 = nodeCtx2.startInitCommand(privkey2, encodedPassword, initSetting, csProps,
csProvider, testDb2, consolePrompter, bindingConfig2, quitLatch);
AsyncCallback<HashDigest> callback2 = nodeCtx2.startInitCommand(privkey2, encodedPassword, initSetting, testDb2,
consolePrompter, bindingConfig2, quitLatch);


DBConnectionConfig testDb3 = new DBConnectionConfig(); DBConnectionConfig testDb3 = new DBConnectionConfig();
testDb3.setConnectionUri(dbConns[3]); testDb3.setConnectionUri(dbConns[3]);
LedgerBindingConfig bindingConfig3 = new LedgerBindingConfig(); LedgerBindingConfig bindingConfig3 = new LedgerBindingConfig();
AsyncCallback<HashDigest> callback3 = nodeCtx3.startInitCommand(privkey3, encodedPassword, initSetting, csProps,
csProvider, testDb3, consolePrompter, bindingConfig3, quitLatch);
AsyncCallback<HashDigest> callback3 = nodeCtx3.startInitCommand(privkey3, encodedPassword, initSetting, testDb3,
consolePrompter, bindingConfig3, quitLatch);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();


source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitSettingTest.java → source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitPropertiesTest.java View File

@@ -16,39 +16,44 @@ import com.jd.blockchain.tools.keygen.KeyGenCommand;
import com.jd.blockchain.utils.codec.HexUtils; import com.jd.blockchain.utils.codec.HexUtils;
import test.com.jd.blockchain.intgr.IntegrationBase; import test.com.jd.blockchain.intgr.IntegrationBase;


public class LedgerInitSettingTest {
public class LedgerInitPropertiesTest {


@Test @Test
public void test() throws IOException { public void test() throws IOException {
ClassPathResource ledgerInitSettingResource = new ClassPathResource("ledger.init"); ClassPathResource ledgerInitSettingResource = new ClassPathResource("ledger.init");
InputStream in = ledgerInitSettingResource.getInputStream(); InputStream in = ledgerInitSettingResource.getInputStream();
try { try {
LedgerInitProperties setting = LedgerInitProperties.resolve(in);
assertEquals(4, setting.getConsensusParticipantCount());
String expectedLedgerSeed = "932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe".replace("-", "");
String actualLedgerSeed = HexUtils.encode(setting.getLedgerSeed());
LedgerInitProperties initProps = LedgerInitProperties.resolve(in);
assertEquals(4, initProps.getConsensusParticipantCount());
String expectedLedgerSeed = "932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe"
.replace("-", "");
String actualLedgerSeed = HexUtils.encode(initProps.getLedgerSeed());
assertEquals(expectedLedgerSeed, actualLedgerSeed); assertEquals(expectedLedgerSeed, actualLedgerSeed);
ConsensusParticipantConfig part0 = setting.getConsensusParticipant(0);

assertEquals("com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider",
initProps.getConsensusProvider());

String[] cryptoProviders = initProps.getCryptoProviders();
assertEquals(2, cryptoProviders.length);
assertEquals("com.jd.blockchain.crypto.service.classic.ClassicCryptoService", cryptoProviders[0]);
assertEquals("com.jd.blockchain.crypto.service.sm.SMCryptoService", cryptoProviders[1]);

ConsensusParticipantConfig part0 = initProps.getConsensusParticipant(0);
assertEquals("jd.com", part0.getName()); assertEquals("jd.com", part0.getName());
assertEquals("keys/jd-com.pub", part0.getPubKeyPath());
PubKey pubKey0 = KeyGenCommand.decodePubKey("3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9"); PubKey pubKey0 = KeyGenCommand.decodePubKey("3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9");
assertEquals(pubKey0, part0.getPubKey()); assertEquals(pubKey0, part0.getPubKey());
// assertEquals("127.0.0.1", part0.getConsensusAddress().getHost());
// assertEquals(8900, part0.getConsensusAddress().getPort());
// assertEquals(true, part0.getConsensusAddress().isSecure());
assertEquals("127.0.0.1", part0.getInitializerAddress().getHost()); assertEquals("127.0.0.1", part0.getInitializerAddress().getHost());
assertEquals(8800, part0.getInitializerAddress().getPort()); assertEquals(8800, part0.getInitializerAddress().getPort());
assertEquals(true, part0.getInitializerAddress().isSecure()); assertEquals(true, part0.getInitializerAddress().isSecure());
ConsensusParticipantConfig part1 = setting.getConsensusParticipant(1);
ConsensusParticipantConfig part1 = initProps.getConsensusParticipant(1);
assertEquals(false, part1.getInitializerAddress().isSecure()); assertEquals(false, part1.getInitializerAddress().isSecure());
PubKey pubKey1 = KeyGenCommand.decodePubKey("3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX"); PubKey pubKey1 = KeyGenCommand.decodePubKey("3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX");
assertEquals(pubKey1, part1.getPubKey()); assertEquals(pubKey1, part1.getPubKey());
ConsensusParticipantConfig part2 = setting.getConsensusParticipant(2);
assertEquals(null, part2.getPubKey());
ConsensusParticipantConfig part2 = initProps.getConsensusParticipant(2);
assertEquals("7VeRAr3dSbi1xatq11ZcF7sEPkaMmtZhV9shonGJWk9T4pLe", part2.getPubKey().toBase58());
} finally { } finally {
in.close(); in.close();
} }

+ 22
- 21
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeTest.java View File

@@ -9,22 +9,22 @@ import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;


import com.jd.blockchain.storage.service.utils.MemoryDBConnFactory;
import org.junit.Test; import org.junit.Test;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;


import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.consensus.ConsensusProvider; import com.jd.blockchain.consensus.ConsensusProvider;
import com.jd.blockchain.consensus.ConsensusProviders;
import com.jd.blockchain.consensus.ConsensusSettings; import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.AsymmetricKeypair;
import com.jd.blockchain.crypto.Crypto; import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PrivKey; import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.SignatureDigest; import com.jd.blockchain.crypto.SignatureDigest;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.LedgerBlock; import com.jd.blockchain.ledger.LedgerBlock;
import com.jd.blockchain.ledger.LedgerInitOperation; import com.jd.blockchain.ledger.LedgerInitOperation;
import com.jd.blockchain.ledger.UserRegisterOperation; import com.jd.blockchain.ledger.UserRegisterOperation;
@@ -35,6 +35,7 @@ import com.jd.blockchain.ledger.core.LedgerRepository;
import com.jd.blockchain.ledger.core.UserAccount; import com.jd.blockchain.ledger.core.UserAccount;
import com.jd.blockchain.ledger.core.UserAccountSet; import com.jd.blockchain.ledger.core.UserAccountSet;
import com.jd.blockchain.ledger.core.impl.LedgerManager; import com.jd.blockchain.ledger.core.impl.LedgerManager;
import com.jd.blockchain.storage.service.utils.MemoryDBConnFactory;
import com.jd.blockchain.tools.initializer.DBConnectionConfig; import com.jd.blockchain.tools.initializer.DBConnectionConfig;
import com.jd.blockchain.tools.initializer.LedgerInitProcess; import com.jd.blockchain.tools.initializer.LedgerInitProcess;
import com.jd.blockchain.tools.initializer.LedgerInitProperties; import com.jd.blockchain.tools.initializer.LedgerInitProperties;
@@ -60,6 +61,9 @@ public class LedgerInitializeTest {
DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class);
} }


private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

public static final String PASSWORD = IntegrationBase.PASSWORD; public static final String PASSWORD = IntegrationBase.PASSWORD;


public static final String[] PUB_KEYS = IntegrationBase.PUB_KEYS; public static final String[] PUB_KEYS = IntegrationBase.PUB_KEYS;
@@ -85,8 +89,8 @@ public class LedgerInitializeTest {
Prompter consolePrompter = new PresetAnswerPrompter("N"); // new ConsolePrompter(); Prompter consolePrompter = new PresetAnswerPrompter("N"); // new ConsolePrompter();
LedgerInitProperties initSetting = loadInitSetting(); LedgerInitProperties initSetting = loadInitSetting();
Properties props = loadConsensusSetting(config.getConfigPath()); Properties props = loadConsensusSetting(config.getConfigPath());
ConsensusProvider csProvider = LedgerInitConsensusConfig.getConsensusProvider(config.getProvider());
ConsensusSettings csProps = csProvider.getSettingsFactory().getConsensusSettingsBuilder().createSettings(props);
// ConsensusProvider csProvider = LedgerInitConsensusConfig.getConsensusProvider(config.getProvider());
// ConsensusSettings csProps = csProvider.getSettingsFactory().getConsensusSettingsBuilder().createSettings(props);


NodeContext node0 = new NodeContext(initSetting.getConsensusParticipant(0).getInitializerAddress(), NodeContext node0 = new NodeContext(initSetting.getConsensusParticipant(0).getInitializerAddress(),
serviceRegisterMap); serviceRegisterMap);
@@ -100,26 +104,22 @@ public class LedgerInitializeTest {
PrivKey privkey0 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[0], PASSWORD); PrivKey privkey0 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[0], PASSWORD);
DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri(dbConnections[0]); testDb0.setConnectionUri(dbConnections[0]);
AsyncCallback<HashDigest> callback0 = node0.startInit(0, privkey0, initSetting, csProps, csProvider, testDb0,
consolePrompter);
AsyncCallback<HashDigest> callback0 = node0.startInit(0, privkey0, initSetting, testDb0, consolePrompter);


PrivKey privkey1 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[1], PASSWORD); PrivKey privkey1 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[1], PASSWORD);
DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri(dbConnections[1]); testDb1.setConnectionUri(dbConnections[1]);
AsyncCallback<HashDigest> callback1 = node1.startInit(1, privkey1, initSetting, csProps, csProvider, testDb1,
consolePrompter);
AsyncCallback<HashDigest> callback1 = node1.startInit(1, privkey1, initSetting, testDb1, consolePrompter);


PrivKey privkey2 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[2], PASSWORD); PrivKey privkey2 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[2], PASSWORD);
DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri(dbConnections[2]); testDb2.setConnectionUri(dbConnections[2]);
AsyncCallback<HashDigest> callback2 = node2.startInit(2, privkey2, initSetting, csProps, csProvider, testDb2,
consolePrompter);
AsyncCallback<HashDigest> callback2 = node2.startInit(2, privkey2, initSetting, testDb2, consolePrompter);


PrivKey privkey3 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[3], PASSWORD); PrivKey privkey3 = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV_KEYS[3], PASSWORD);
DBConnectionConfig testDb03 = new DBConnectionConfig(); DBConnectionConfig testDb03 = new DBConnectionConfig();
testDb03.setConnectionUri(dbConnections[3]); testDb03.setConnectionUri(dbConnections[3]);
AsyncCallback<HashDigest> callback3 = node3.startInit(3, privkey3, initSetting, csProps, csProvider, testDb03,
consolePrompter);
AsyncCallback<HashDigest> callback3 = node3.startInit(3, privkey3, initSetting, testDb03, consolePrompter);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();
@@ -234,16 +234,14 @@ public class LedgerInitializeTest {
} }


public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter) {
DBConnectionConfig dbConnConfig, Prompter prompter) {


partiKey = new AsymmetricKeypair(setting.getConsensusParticipant(0).getPubKey(), privKey); partiKey = new AsymmetricKeypair(setting.getConsensusParticipant(0).getPubKey(), privKey);


ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
return initProcess.initialize(currentId, privKey, setting, csProps, csProvider, dbConnConfig,
prompter);
return initProcess.initialize(currentId, privKey, setting, dbConnConfig, prompter);
} }
}; };


@@ -251,10 +249,14 @@ public class LedgerInitializeTest {
} }


public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(int currentId, PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, boolean autoVerifyHash) {
DBConnectionConfig dbConnConfig, Prompter prompter, boolean autoVerifyHash) {


CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}
CryptoConfig cryptoSetting = new CryptoConfig(); CryptoConfig cryptoSetting = new CryptoConfig();
cryptoSetting.setSupportedProviders(supportedProviders);
cryptoSetting.setAutoVerifyHash(autoVerifyHash); cryptoSetting.setAutoVerifyHash(autoVerifyHash);
cryptoSetting.setHashAlgorithm(Crypto.getAlgorithm("SHA256")); cryptoSetting.setHashAlgorithm(Crypto.getAlgorithm("SHA256"));


@@ -263,8 +265,7 @@ public class LedgerInitializeTest {
ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
return initProcess.initialize(currentId, privKey, setting, csProps, csProvider, dbConnConfig,
prompter, cryptoSetting);
return initProcess.initialize(currentId, privKey, setting, dbConnConfig, prompter, cryptoSetting);
} }
}; };




+ 11
- 13
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeWeb4Nodes.java View File

@@ -94,23 +94,23 @@ public class LedgerInitializeWeb4Nodes {


DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri(dbConns[0]); testDb0.setConnectionUri(dbConns[0]);
AsyncCallback<HashDigest> callback0 = node0.startInit(privkey0, initSetting, csProps, csProvider, testDb0,
consolePrompter, quitLatch);
AsyncCallback<HashDigest> callback0 = node0.startInit(privkey0, initSetting, testDb0, consolePrompter,
quitLatch);


DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri(dbConns[1]); testDb1.setConnectionUri(dbConns[1]);
AsyncCallback<HashDigest> callback1 = node1.startInit(privkey1, initSetting, csProps, csProvider, testDb1,
consolePrompter, quitLatch);
AsyncCallback<HashDigest> callback1 = node1.startInit(privkey1, initSetting, testDb1, consolePrompter,
quitLatch);


DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri(dbConns[2]); testDb2.setConnectionUri(dbConns[2]);
AsyncCallback<HashDigest> callback2 = node2.startInit(privkey2, initSetting, csProps, csProvider, testDb2,
consolePrompter, quitLatch);
AsyncCallback<HashDigest> callback2 = node2.startInit(privkey2, initSetting, testDb2, consolePrompter,
quitLatch);


DBConnectionConfig testDb03 = new DBConnectionConfig(); DBConnectionConfig testDb03 = new DBConnectionConfig();
testDb03.setConnectionUri(dbConns[3]); testDb03.setConnectionUri(dbConns[3]);
AsyncCallback<HashDigest> callback3 = node3.startInit(privkey3, initSetting, csProps, csProvider, testDb03,
consolePrompter, quitLatch);
AsyncCallback<HashDigest> callback3 = node3.startInit(privkey3, initSetting, testDb03, consolePrompter,
quitLatch);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();
@@ -230,8 +230,7 @@ public class LedgerInitializeWeb4Nodes {
} }


public AsyncCallback<HashDigest> startInit(PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, CountDownLatch quitLatch) {
DBConnectionConfig dbConnConfig, Prompter prompter, CountDownLatch quitLatch) {


ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
@@ -239,8 +238,8 @@ public class LedgerInitializeWeb4Nodes {
doStartServer(); doStartServer();


NodeWebContext.this.dbConnConfig = dbConnConfig; NodeWebContext.this.dbConnConfig = dbConnConfig;
HashDigest ledgerHash = NodeWebContext.this.initProcess.initialize(id, privKey, setting, csProps,
csProvider, dbConnConfig, prompter);
HashDigest ledgerHash = NodeWebContext.this.initProcess.initialize(id, privKey, setting,
dbConnConfig, prompter);


System.out.printf("ledgerHash = %s \r\n", ledgerHash.toBase58()); System.out.printf("ledgerHash = %s \r\n", ledgerHash.toBase58());


@@ -252,7 +251,6 @@ public class LedgerInitializeWeb4Nodes {
return invoker.start(); return invoker.start();
} }



public void doStartServer() { public void doStartServer() {
String argServerAddress = String.format("--server.address=%s", serverAddress.getHost()); String argServerAddress = String.format("--server.address=%s", serverAddress.getHost());
String argServerPort = String.format("--server.port=%s", serverAddress.getPort()); String argServerPort = String.format("--server.port=%s", serverAddress.getPort());


+ 7
- 9
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/initializer/LedgerInitializeWeb4SingleStepsTest.java View File

@@ -340,8 +340,7 @@ public class LedgerInitializeWeb4SingleStepsTest {
} }


public AsyncCallback<HashDigest> startInit(PrivKey privKey, LedgerInitProperties setting, public AsyncCallback<HashDigest> startInit(PrivKey privKey, LedgerInitProperties setting,
ConsensusSettings csProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, CountDownLatch quitLatch) {
DBConnectionConfig dbConnConfig, Prompter prompter, CountDownLatch quitLatch) {


ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() { ThreadInvoker<HashDigest> invoker = new ThreadInvoker<HashDigest>() {
@Override @Override
@@ -350,8 +349,8 @@ public class LedgerInitializeWeb4SingleStepsTest {


// NodeWebContext.this.initProcess = ctx.getBean(LedgerInitProcess.class); // NodeWebContext.this.initProcess = ctx.getBean(LedgerInitProcess.class);
NodeWebContext.this.dbConnConfig = dbConnConfig; NodeWebContext.this.dbConnConfig = dbConnConfig;
HashDigest ledgerHash = NodeWebContext.this.initProcess.initialize(id, privKey, setting, csProps,
csProvider, dbConnConfig, prompter);
HashDigest ledgerHash = NodeWebContext.this.initProcess.initialize(id, privKey, setting,
dbConnConfig, prompter);


quitLatch.countDown(); quitLatch.countDown();
return ledgerHash; return ledgerHash;
@@ -362,9 +361,8 @@ public class LedgerInitializeWeb4SingleStepsTest {
} }


public AsyncCallback<HashDigest> startInitCommand(PrivKey privKey, String base58Pwd, public AsyncCallback<HashDigest> startInitCommand(PrivKey privKey, String base58Pwd,
LedgerInitProperties ledgerSetting, ConsensusSettings csProps, ConsensusProvider csProvider,
DBConnectionConfig dbConnConfig, Prompter prompter, LedgerBindingConfig conf,
CountDownLatch quitLatch) {
LedgerInitProperties ledgerSetting, DBConnectionConfig dbConnConfig, Prompter prompter,
LedgerBindingConfig conf, CountDownLatch quitLatch) {
this.db = new CompositeConnectionFactory(); this.db = new CompositeConnectionFactory();
this.dbConnConfig = dbConnConfig; this.dbConnConfig = dbConnConfig;


@@ -372,8 +370,8 @@ public class LedgerInitializeWeb4SingleStepsTest {
@Override @Override
protected HashDigest invoke() throws Exception { protected HashDigest invoke() throws Exception {
LedgerInitCommand initCmd = new LedgerInitCommand(); LedgerInitCommand initCmd = new LedgerInitCommand();
HashDigest ledgerHash = initCmd.startInit(id, privKey, base58Pwd, ledgerSetting, csProps,
csProvider, dbConnConfig, prompter, conf, db);
HashDigest ledgerHash = initCmd.startInit(id, privKey, base58Pwd, ledgerSetting, dbConnConfig,
prompter, conf, db);
NodeWebContext.this.ledgerManager = initCmd.getLedgerManager(); NodeWebContext.this.ledgerManager = initCmd.getLedgerManager();
quitLatch.countDown(); quitLatch.countDown();
return ledgerHash; return ledgerHash;


+ 10
- 15
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/ledger/LedgerBlockGeneratingTest.java View File

@@ -141,41 +141,36 @@ public class LedgerBlockGeneratingTest {
NodeContext node3 = new NodeContext(initSetting.getConsensusParticipant(3).getInitializerAddress(), NodeContext node3 = new NodeContext(initSetting.getConsensusParticipant(3).getInitializerAddress(),
serviceRegisterMap); serviceRegisterMap);


String[] memConns = new String[]{
"memory://local/0",
"memory://local/1",
"memory://local/2",
"memory://local/3"
};

String[] memConns = new String[] { "memory://local/0", "memory://local/1", "memory://local/2",
"memory://local/3" };


PrivKey privkey0 = KeyGenCommand.decodePrivKeyWithRawPassword(LedgerInitializeTest.PRIV_KEYS[0], PrivKey privkey0 = KeyGenCommand.decodePrivKeyWithRawPassword(LedgerInitializeTest.PRIV_KEYS[0],
LedgerInitializeTest.PASSWORD); LedgerInitializeTest.PASSWORD);
DBConnectionConfig testDb0 = new DBConnectionConfig(); DBConnectionConfig testDb0 = new DBConnectionConfig();
testDb0.setConnectionUri(memConns[0]); testDb0.setConnectionUri(memConns[0]);
AsyncCallback<HashDigest> callback0 = node0.startInit(0, privkey0, initSetting, csProps, csProvider, testDb0,
consolePrompter, !optimized);
AsyncCallback<HashDigest> callback0 = node0.startInit(0, privkey0, initSetting, testDb0, consolePrompter,
!optimized);


PrivKey privkey1 = KeyGenCommand.decodePrivKeyWithRawPassword(LedgerInitializeTest.PRIV_KEYS[1], PrivKey privkey1 = KeyGenCommand.decodePrivKeyWithRawPassword(LedgerInitializeTest.PRIV_KEYS[1],
LedgerInitializeTest.PASSWORD); LedgerInitializeTest.PASSWORD);
DBConnectionConfig testDb1 = new DBConnectionConfig(); DBConnectionConfig testDb1 = new DBConnectionConfig();
testDb1.setConnectionUri(memConns[1]); testDb1.setConnectionUri(memConns[1]);
AsyncCallback<HashDigest> callback1 = node1.startInit(1, privkey1, initSetting, csProps, csProvider, testDb1,
consolePrompter, !optimized);
AsyncCallback<HashDigest> callback1 = node1.startInit(1, privkey1, initSetting, testDb1, consolePrompter,
!optimized);


PrivKey privkey2 = KeyGenCommand.decodePrivKeyWithRawPassword(LedgerInitializeTest.PRIV_KEYS[2], PrivKey privkey2 = KeyGenCommand.decodePrivKeyWithRawPassword(LedgerInitializeTest.PRIV_KEYS[2],
LedgerInitializeTest.PASSWORD); LedgerInitializeTest.PASSWORD);
DBConnectionConfig testDb2 = new DBConnectionConfig(); DBConnectionConfig testDb2 = new DBConnectionConfig();
testDb2.setConnectionUri(memConns[2]); testDb2.setConnectionUri(memConns[2]);
AsyncCallback<HashDigest> callback2 = node2.startInit(2, privkey2, initSetting, csProps, csProvider, testDb2,
consolePrompter, !optimized);
AsyncCallback<HashDigest> callback2 = node2.startInit(2, privkey2, initSetting, testDb2, consolePrompter,
!optimized);


PrivKey privkey3 = KeyGenCommand.decodePrivKeyWithRawPassword(LedgerInitializeTest.PRIV_KEYS[3], PrivKey privkey3 = KeyGenCommand.decodePrivKeyWithRawPassword(LedgerInitializeTest.PRIV_KEYS[3],
LedgerInitializeTest.PASSWORD); LedgerInitializeTest.PASSWORD);
DBConnectionConfig testDb03 = new DBConnectionConfig(); DBConnectionConfig testDb03 = new DBConnectionConfig();
testDb03.setConnectionUri(memConns[3]); testDb03.setConnectionUri(memConns[3]);
AsyncCallback<HashDigest> callback3 = node3.startInit(3, privkey3, initSetting, csProps, csProvider, testDb03,
consolePrompter, !optimized);
AsyncCallback<HashDigest> callback3 = node3.startInit(3, privkey3, initSetting, testDb03, consolePrompter,
!optimized);


HashDigest ledgerHash0 = callback0.waitReturn(); HashDigest ledgerHash0 = callback0.waitReturn();
HashDigest ledgerHash1 = callback1.waitReturn(); HashDigest ledgerHash1 = callback1.waitReturn();


+ 1
- 0
source/test/test-integration/src/test/resources/keys/parti2.pub View File

@@ -0,0 +1 @@
3snPdw7i7PZi6TStiyc6mzjprnNhgs2atSGNS8wPYzhbKaUWGFJt7x

+ 13
- 1
source/test/test-integration/src/test/resources/ledger.init View File

@@ -5,6 +5,18 @@ ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323
#账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途; #账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途;
ledger.name= ledger.name=



#共识服务提供者;必须;
consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider

#共识服务的参数配置;必须;
consensus.conf=classpath:bftsmart.config

#密码服务提供者列表,以英文逗点“,”分隔;必须;
crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService, \
com.jd.blockchain.crypto.service.sm.SMCryptoService


#参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置; #参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置;
cons_parti.count=4 cons_parti.count=4


@@ -49,7 +61,7 @@ cons_parti.1.initializer.secure=false
#第2个参与方的名称; #第2个参与方的名称;
cons_parti.2.name=bt.com cons_parti.2.name=bt.com
#第2个参与方的公钥文件路径; #第2个参与方的公钥文件路径;
cons_parti.2.pubkey-path=keys/bt-com.pub
cons_parti.2.pubkey-path=classpath:keys/parti2.pub
#第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数; #第2个参与方的公钥内容(由keygen工具生成);此参数优先于 pubkey-path 参数;
cons_parti.2.pubkey= cons_parti.2.pubkey=
#第2个参与方的共识服务的主机地址; #第2个参与方的共识服务的主机地址;


+ 10
- 0
source/test/test-integration/src/test/resources/ledger_init_test.init View File

@@ -5,6 +5,16 @@ ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323
#账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途; #账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途;
ledger.name= ledger.name=


#共识服务提供者;必须;
consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider

#共识服务的参数配置;必须;
consensus.conf=classpath:bftsmart.config

#密码服务提供者列表,以英文逗点“,”分隔;必须;
crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService, \
com.jd.blockchain.crypto.service.sm.SMCryptoService

#参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置; #参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置;
cons_parti.count=4 cons_parti.count=4




+ 11
- 0
source/test/test-integration/src/test/resources/ledger_init_test_web2.init View File

@@ -5,6 +5,17 @@ ledger.seed=932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323
#账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途; #账本的描述名称;此属性不参与共识,仅仅在当前参与方的本地节点用于描述用途;
#ledger.name= #ledger.name=


#共识服务提供者;必须;
consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider

#共识服务的参数配置;必须;
consensus.conf=classpath:bftsmart.config

#密码服务提供者列表,以英文逗点“,”分隔;必须;
crypto.service-providers=com.jd.blockchain.crypto.service.classic.ClassicCryptoService, \
com.jd.blockchain.crypto.service.sm.SMCryptoService


#参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置; #参与方的个数,后续以 cons_parti.id 分别标识每一个参与方的配置;
cons_parti.count=4 cons_parti.count=4




+ 0
- 36
source/test/test-stp-community/pom.xml View File

@@ -1,36 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>test</artifactId>
<groupId>com.jd.blockchain</groupId>
<version>0.9.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>test-stp-community</artifactId>

<name>test-stp-community</name>

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>

<dependencies>

<dependency>
<groupId>com.jd.blockchain</groupId>
<artifactId>stp-communication</artifactId>
<version>${project.version}</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

+ 0
- 37
source/test/test-stp-community/src/main/java/com/jd/blockchain/stp/commucation/MyMessageExecutor.java View File

@@ -1,37 +0,0 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.stp.commucation.MyMessageExecutor
* Author: shaozhuguang
* Department: Y事业部
* Date: 2019/4/17 下午3:38
* Description:
*/
package com.jd.blockchain.stp.commucation;

import com.jd.blockchain.stp.communication.MessageExecutor;
import com.jd.blockchain.stp.communication.RemoteSession;

import java.nio.charset.Charset;

/**
*
* @author shaozhuguang
* @create 2019/4/17
* @since 1.0.0
*/

public class MyMessageExecutor implements MessageExecutor {

@Override
public byte[] receive(String key, byte[] data, RemoteSession session) {
String receiveMsg = new String(data, Charset.defaultCharset());
System.out.printf("receive client {%s} request {%s} \r\n", session.remoteNode().toString(), receiveMsg);
String msg = session.localId() + " -> received !!!";
return msg.getBytes(Charset.defaultCharset());
}

@Override
public REPLY replyType() {
return REPLY.AUTO;
}
}

+ 0
- 75
source/test/test-stp-community/src/main/java/com/jd/blockchain/stp/commucation/StpReceiversBoot.java View File

@@ -1,75 +0,0 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.StpReceiversBoot
* Author: shaozhuguang
* Department: Y事业部
* Date: 2019/4/18 下午3:44
* Description:
*/
package com.jd.blockchain.stp.commucation;

import com.jd.blockchain.stp.communication.MessageExecutor;
import com.jd.blockchain.stp.communication.manager.RemoteSessionManager;
import com.jd.blockchain.stp.communication.node.LocalNode;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
*
* @author shaozhuguang
* @create 2019/4/18
* @since 1.0.0
*/

public class StpReceiversBoot {

private int[] listenPorts;

private final String remoteHost = "127.0.0.1";

private ExecutorService threadPool;

public StpReceiversBoot(int... ports) {
listenPorts = ports;
threadPool = Executors.newFixedThreadPool(ports.length + 2);
}

public RemoteSessionManager[] start(MessageExecutor messageExecutor) {

final int totalSessionSize = listenPorts.length;

CountDownLatch countDownLatch = new CountDownLatch(totalSessionSize);

RemoteSessionManager[] sessionManagers = new RemoteSessionManager[totalSessionSize];
for (int i = 0; i < totalSessionSize; i++) {
final int port = listenPorts[i], index = i;
threadPool.execute(() -> {
// 创建本地节点
final LocalNode localNode = new LocalNode(remoteHost, port, messageExecutor);
try {
// 启动当前节点
RemoteSessionManager sessionManager = new RemoteSessionManager(localNode);
sessionManagers[index] = sessionManager;
System.out.printf("Current Node {%s} start success !!! \r\n", localNode.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
});
}

// 等待所有节点启动完成
try {
countDownLatch.await();
} catch (Exception e) {
e.printStackTrace();
}

return sessionManagers;
}


}

+ 0
- 43
source/test/test-stp-community/src/test/java/com/jd/blockchain/StpReceiversBootTest.java View File

@@ -1,43 +0,0 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.StpReceiversBootTest
* Author: shaozhuguang
* Department: Y事业部
* Date: 2019/4/18 下午3:53
* Description:
*/
package com.jd.blockchain;

import com.jd.blockchain.stp.commucation.MyMessageExecutor;
import com.jd.blockchain.stp.commucation.StpReceiversBoot;
import com.jd.blockchain.stp.communication.manager.RemoteSessionManager;
import org.junit.Test;

/**
*
* @author shaozhuguang
* @create 2019/4/18
* @since 1.0.0
*/

public class StpReceiversBootTest {

public static final int[] localPorts = new int[]{9900, 9901};

@Test
public void test() {
StpReceiversBoot stpReceiversBoot = new StpReceiversBoot(9900, 9901);
RemoteSessionManager[] sessionManagers = stpReceiversBoot.start(new MyMessageExecutor());

try {
Thread.sleep(10000);

// 关闭所有的监听器
for (RemoteSessionManager sessionManager : sessionManagers) {
sessionManager.connectionManager().closeReceiver();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

+ 0
- 96
source/test/test-stp-community/src/test/java/com/jd/blockchain/StpSenderTest.java View File

@@ -1,96 +0,0 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.StpSenderTest
* Author: shaozhuguang
* Department: Y事业部
* Date: 2019/4/18 下午3:56
* Description:
*/
package com.jd.blockchain;

import com.jd.blockchain.stp.commucation.MyMessageExecutor;
import com.jd.blockchain.stp.commucation.StpReceiversBoot;
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.message.LoadMessage;
import com.jd.blockchain.stp.communication.node.RemoteNode;
import org.junit.Test;

import java.util.Iterator;
import java.util.LinkedList;

/**
*
* @author shaozhuguang
* @create 2019/4/18
* @since 1.0.0
*/

public class StpSenderTest {

// 本地的端口
private static final int localPort = 9800;

// 连接的远端端口集合
private static final int[] remotePorts = StpReceiversBootTest.localPorts;

// 本地节点信息
private static final String localHost = "127.0.0.1";

@Test
public void test() {
// 首先启动本地节点
StpReceiversBoot stpReceiversBoot = new StpReceiversBoot(localPort);
RemoteSessionManager[] sessionManagers = stpReceiversBoot.start(new MyMessageExecutor());

// 本地节点启动完成后
if (sessionManagers != null && sessionManagers.length > 0) {
RemoteSessionManager localSessionManager = sessionManagers[0];

// 连接远端的两个节点
RemoteNode[] remoteNodes = new RemoteNode[]{
new RemoteNode(localHost, remotePorts[0]),
new RemoteNode(localHost, remotePorts[1])
};

RemoteSession[] remoteSessions = localSessionManager.newSessions(remoteNodes);

// 生成请求对象
LoadMessage loadMessage = new StpTest.StpLoadMessage(localHost + ":" + localPort);

// 异步发送处理过程
CallBackBarrier callBackBarrier = CallBackBarrier.newCallBackBarrier(remoteSessions.length, 10000);

// 发送请求至remotes
LinkedList<CallBackDataListener> responses = new LinkedList<>();
for (RemoteSession remoteSession : remoteSessions) {
CallBackDataListener response = remoteSession.asyncRequest(loadMessage, callBackBarrier);
responses.addLast(response);
}

// 超时判断
try {
if (callBackBarrier.tryCall()) {

// 说明结果已经全部返回
// 打印出所有的结果
// 通过迭代器遍历链表
Iterator<CallBackDataListener> iterator = responses.iterator();
while (iterator.hasNext()) {
CallBackDataListener response = iterator.next();
// 判断是否已完成,对于没有完成的直接放弃(因为已经超时)
if (response.isDone()) {
System.out.printf("Receive Response {%s} {%s} \r\n",
response.remoteNode().toString(), new String(response.getCallBackData()));
}
}
}
Thread.sleep(Integer.MAX_VALUE);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}

+ 0
- 206
source/test/test-stp-community/src/test/java/com/jd/blockchain/StpTest.java View File

@@ -1,206 +0,0 @@
/**
* Copyright: Copyright 2016-2020 JD.COM All Right Reserved
* FileName: com.jd.blockchain.StpTest
* Author: shaozhuguang
* Department: Y事业部
* Date: 2019/4/11 下午3:31
* Description:
*/
package com.jd.blockchain;

import com.jd.blockchain.stp.commucation.MyMessageExecutor;
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.message.LoadMessage;
import com.jd.blockchain.stp.communication.node.LocalNode;
import com.jd.blockchain.stp.communication.node.RemoteNode;
import org.junit.Before;
import org.junit.Test;

import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import static org.junit.Assert.assertNull;

/**
*
* @author shaozhuguang
* @create 2019/4/11
* @since 1.0.0
*/

public class StpTest {

private int maxWaitTime = 2000;

private final String remoteHost = "127.0.0.1";

private final int localPort = 9001;

private final int[] listenPorts = new int[]{9001, 9002, 9003, 9004};

private final RemoteSessionManager[] sessionManagers = new RemoteSessionManager[listenPorts.length];

private final ExecutorService threadPool = Executors.newFixedThreadPool(6);

private RemoteSession[] remoteSessions;

@Before
public void init() {

System.out.println("---------- listenStart -----------");
listenStart();
System.out.println("---------- listenComplete -----------");
System.out.println("---------- ConnectionStart ----------");
connectOneOther();
System.out.println("---------- ConnectionComplete ----------");
}

private void listenStart() {
CountDownLatch countDownLatch = new CountDownLatch(listenPorts.length);

for (int i = 0; i < listenPorts.length; i++) {
final int port = listenPorts[i], index = i;
threadPool.execute(() -> {
// 创建本地节点
final LocalNode localNode = new LocalNode(remoteHost, port, new MyMessageExecutor());
try {
// 启动当前节点
RemoteSessionManager sessionManager = new RemoteSessionManager(localNode);
sessionManagers[index] = sessionManager;
System.out.printf("Current Node {%s} start success !!! \r\n", localNode.toString());
} catch (Exception e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
});
}

// 等待所有节点启动完成
try {
countDownLatch.await();
} catch (Exception e) {
e.printStackTrace();
}
}

private void connectAllOthers() {
// 所有节点完成之后,需要启动
// 启动一个节点
RemoteSessionManager starter = sessionManagers[0];

// 当前节点需要连接到其他3个节点
RemoteNode[] remoteNodes = new RemoteNode[listenPorts.length - 1];
int index = 0;
for (int port : listenPorts) {
if (port != localPort) {
remoteNodes[index++] = new RemoteNode(remoteHost, port);
}
}

remoteSessions = starter.newSessions(remoteNodes);
}

private void connectOneOther() {
// 所有节点完成之后,需要启动
// 启动一个节点
RemoteSessionManager starter = sessionManagers[0];

// 当前节点需要连接到其他3个节点
RemoteNode[] remoteNodes = new RemoteNode[1];
int index = 0;
for (int port : listenPorts) {
if (port != localPort && index < 1) {
remoteNodes[index++] = new RemoteNode(remoteHost, port);
}
}

remoteSessions = starter.newSessions(remoteNodes);
}

private void connectOneErrorNode() {
// 所有节点完成之后,需要启动
// 启动一个节点
RemoteSessionManager starter = sessionManagers[0];

// 当前节点需要连接到其他3个节点
RemoteNode[] remoteNodes = new RemoteNode[1];

remoteNodes[0] = new RemoteNode(remoteHost, 10001);

remoteSessions = starter.newSessions(remoteNodes);

assertNull(remoteSessions);
}


@Test
public void test() {

try {
Thread.sleep(3000);

} catch (Exception e) {
e.printStackTrace();
}

// 生成请求对象
LoadMessage loadMessage = new StpLoadMessage(remoteHost + ":" + localPort);

// 异步发送处理过程
CallBackBarrier callBackBarrier = CallBackBarrier.newCallBackBarrier(remoteSessions.length, 10000);

// 发送请求至remotes
LinkedList<CallBackDataListener> responses = new LinkedList<>();
for (RemoteSession remoteSession : remoteSessions) {
CallBackDataListener response = remoteSession.asyncRequest(loadMessage, callBackBarrier);
responses.addLast(response);
}

// 超时判断
try {
if (callBackBarrier.tryCall()) {

// 说明结果已经全部返回
// 打印出所有的结果
// 通过迭代器遍历链表
Iterator<CallBackDataListener> iterator = responses.iterator();
while (iterator.hasNext()) {
CallBackDataListener response = iterator.next();
// 判断是否已完成,对于没有完成的直接放弃(因为已经超时)
if (response.isDone()) {
System.out.printf("Receive Response {%s} {%s} \r\n",
response.remoteNode().toString(), new String(response.getCallBackData()));
}
}
}
Thread.sleep(Integer.MAX_VALUE);
} catch (Exception e) {
e.printStackTrace();
}


}

public static class StpLoadMessage implements LoadMessage {

private String localInfo;

public StpLoadMessage(String localInfo) {
this.localInfo = localInfo;
}

@Override
public byte[] toBytes() {
String msg = localInfo + " -> Send !!!";
return msg.getBytes(Charset.defaultCharset());
}
}
}

+ 47
- 61
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitCommand.java View File

@@ -1,7 +1,6 @@
package com.jd.blockchain.tools.initializer; package com.jd.blockchain.tools.initializer;


import java.io.File; import java.io.File;
import java.util.Properties;


import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
@@ -11,9 +10,6 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.ConfigurableApplicationContext;


import com.jd.blockchain.consensus.ConsensusProvider;
import com.jd.blockchain.consensus.ConsensusProviders;
import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PrivKey; import com.jd.blockchain.crypto.PrivKey;
@@ -23,7 +19,6 @@ import com.jd.blockchain.tools.initializer.LedgerBindingConfig.BindingConfig;
import com.jd.blockchain.tools.initializer.LedgerInitProperties.ConsensusParticipantConfig; import com.jd.blockchain.tools.initializer.LedgerInitProperties.ConsensusParticipantConfig;
import com.jd.blockchain.tools.keygen.KeyGenCommand; import com.jd.blockchain.tools.keygen.KeyGenCommand;
import com.jd.blockchain.utils.ArgumentSet; import com.jd.blockchain.utils.ArgumentSet;
import com.jd.blockchain.utils.ConsoleUtils;
import com.jd.blockchain.utils.ArgumentSet.ArgEntry; import com.jd.blockchain.utils.ArgumentSet.ArgEntry;
import com.jd.blockchain.utils.ArgumentSet.Setting; import com.jd.blockchain.utils.ArgumentSet.Setting;
import com.jd.blockchain.utils.io.FileUtils; import com.jd.blockchain.utils.io.FileUtils;
@@ -51,72 +46,68 @@ public class LedgerInitCommand {
// 是否输出调试信息; // 是否输出调试信息;
private static final String DEBUG_OPT = "-debug"; private static final String DEBUG_OPT = "-debug";


private static final Prompter DEFAULT_PROMPTER = new ConsolePrompter();

/** /**
* 入口; * 入口;
* *
* @param args * @param args
*/ */
public static void main(String[] args) { public static void main(String[] args) {
Prompter prompter = DEFAULT_PROMPTER;

Setting argSetting = ArgumentSet.setting().prefix(LOCAL_ARG, INI_ARG).option(DEBUG_OPT); Setting argSetting = ArgumentSet.setting().prefix(LOCAL_ARG, INI_ARG).option(DEBUG_OPT);
ArgumentSet argset = ArgumentSet.resolve(args, argSetting); ArgumentSet argset = ArgumentSet.resolve(args, argSetting);


try { try {
ArgEntry localArg = argset.getArg(LOCAL_ARG); ArgEntry localArg = argset.getArg(LOCAL_ARG);
if (localArg == null) { if (localArg == null) {
ConsoleUtils.info("Miss local config file which can be specified with arg [%s]!!!", LOCAL_ARG);
prompter.info("Miss local config file which can be specified with arg [%s]!!!", LOCAL_ARG);


} }
LocalConfig localConf = LocalConfig.resolve(localArg.getValue()); LocalConfig localConf = LocalConfig.resolve(localArg.getValue());


ArgEntry iniArg = argset.getArg(INI_ARG); ArgEntry iniArg = argset.getArg(INI_ARG);
if (iniArg == null) { if (iniArg == null) {
ConsoleUtils.info("Miss ledger initializing config file which can be specified with arg [%s]!!!",
INI_ARG);
prompter.info("Miss ledger initializing config file which can be specified with arg [%s]!!!", INI_ARG);
return; return;
} }


// // load ledger init setting;
LedgerInitProperties ledgerInitSetting = LedgerInitProperties.resolve(iniArg.getValue());
// load ledger init setting;
LedgerInitProperties ledgerInitProperties = LedgerInitProperties.resolve(iniArg.getValue());
String localNodePubKeyString = localConf.getLocal().getPubKeyString(); String localNodePubKeyString = localConf.getLocal().getPubKeyString();
PubKey localNodePubKey = KeyGenCommand.decodePubKey(localNodePubKeyString); PubKey localNodePubKey = KeyGenCommand.decodePubKey(localNodePubKeyString);
// 地址根据公钥生成 // 地址根据公钥生成
String localNodeAddress = AddressEncoding.generateAddress(localNodePubKey).toBase58(); String localNodeAddress = AddressEncoding.generateAddress(localNodePubKey).toBase58();


// load all pub keys;
// 加载全部公钥;
int currId = -1; int currId = -1;
for (int i = 0; i < ledgerInitSetting.getConsensusParticipantCount(); i++) {
ConsensusParticipantConfig pconf = ledgerInitSetting.getConsensusParticipant(i);
String currPartAddress = pconf.getAddress();
if (currPartAddress == null) {
if (pconf.getPubKeyPath() != null) {
PubKey pubKey = KeyGenCommand.readPubKey(pconf.getPubKeyPath());
pconf.setPubKey(pubKey);
currPartAddress = pconf.getAddress();
}
}
if (localNodeAddress.equals(currPartAddress)) {
for (int i = 0; i < ledgerInitProperties.getConsensusParticipantCount(); i++) {
ConsensusParticipantConfig partiConf = ledgerInitProperties.getConsensusParticipant(i);
// String partiAddress = partiConf.getAddress();
// if (partiAddress == null) {
// if (partiConf.getPubKeyPath() != null) {
// PubKey pubKey = KeyGenCommand.readPubKey(partiConf.getPubKeyPath());
// partiConf.setPubKey(pubKey);
// partiAddress = partiConf.getAddress();
// }
// }
if (localNodeAddress.equals(partiConf.getAddress())) {
currId = i; currId = i;
} }
} }
if (currId == -1) { if (currId == -1) {
throw new IllegalStateException("The current node specified in local.conf is not found in ledger.init!");
throw new IllegalStateException(
"The current node specified in local.conf is not found in ledger.init!");
} }


// 加载当前节点的私钥;
String base58Pwd = localConf.getLocal().getPassword(); String base58Pwd = localConf.getLocal().getPassword();
if (base58Pwd == null) { if (base58Pwd == null) {
base58Pwd = KeyGenCommand.readPasswordString(); base58Pwd = KeyGenCommand.readPasswordString();
} }
PrivKey privKey = KeyGenCommand.decodePrivKey(localConf.getLocal().getPrivKeyString(), base58Pwd); PrivKey privKey = KeyGenCommand.decodePrivKey(localConf.getLocal().getPrivKeyString(), base58Pwd);


// Load consensus properties;
Properties props = FileUtils.readProperties(localConf.getConsensusConfig());
ConsensusProvider csProvider = ConsensusProviders.getProvider(localConf.getConsensusProvider());
ConsensusSettings csSettings = csProvider.getSettingsFactory().getConsensusSettingsBuilder()
.createSettings(props);


// ConsensusProperties csProps = new ConsensusProperties(props);

// Output ledger binding config of peer; // Output ledger binding config of peer;
if (!FileUtils.existDirectory(localConf.getBindingOutDir())) { if (!FileUtils.existDirectory(localConf.getBindingOutDir())) {
FileUtils.makeDirectory(localConf.getBindingOutDir()); FileUtils.makeDirectory(localConf.getBindingOutDir());
@@ -131,27 +122,26 @@ public class LedgerInitCommand {


// 启动初始化; // 启动初始化;
LedgerInitCommand initCommand = new LedgerInitCommand(); LedgerInitCommand initCommand = new LedgerInitCommand();
HashDigest newLedgerHash = initCommand.startInit(currId, privKey, base58Pwd, ledgerInitSetting, csSettings, csProvider,
localConf.getStoragedDb(), new ConsolePrompter(), conf);
HashDigest newLedgerHash = initCommand.startInit(currId, privKey, base58Pwd, ledgerInitProperties,
localConf.getStoragedDb(), prompter, conf);


if (newLedgerHash != null) { if (newLedgerHash != null) {
// success; // success;
// so save ledger binding config to file system; // so save ledger binding config to file system;
conf.store(ledgerBindingFile); conf.store(ledgerBindingFile);
ConsoleUtils.info("\r\n------ Update Ledger binding configuration success! ------[%s]",
prompter.info("\r\n------ Update Ledger binding configuration success! ------[%s]",
ledgerBindingFile.getAbsolutePath()); ledgerBindingFile.getAbsolutePath());
} }


// ConsoleUtils.confirm("\r\n\r\n Press any key to quit. :>");

} catch (Exception e) { } catch (Exception e) {
ConsoleUtils.error("\r\nError!! -- %s\r\n", e.getMessage());
prompter.error("\r\nError!! -- %s\r\n", e.getMessage());
if (argset.hasOption(DEBUG_OPT)) { if (argset.hasOption(DEBUG_OPT)) {
e.printStackTrace(); e.printStackTrace();
} }


ConsoleUtils.error("\r\n Ledger init process has been broken by error!");
prompter.error("\r\n Ledger init process has been broken by error!");
} }
prompter.confirm(InitializingStep.LEDGER_INIT_COMPLETED.toString(), "\r\n\r\n Press any key to quit. :>");


} }


@@ -164,20 +154,19 @@ public class LedgerInitCommand {
public LedgerInitCommand() { public LedgerInitCommand() {
} }


public HashDigest startInit(int currId, PrivKey privKey, String base58Pwd, LedgerInitProperties ledgerSetting,
ConsensusSettings csSettings, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, LedgerBindingConfig conf, Object... extBeans) {
if (currId < 0 || currId >= ledgerSetting.getConsensusParticipantCount()) {
ConsoleUtils.info(
public HashDigest startInit(int currId, PrivKey privKey, String base58Pwd,
LedgerInitProperties ledgerInitProperties, DBConnectionConfig dbConnConfig, Prompter prompter,
LedgerBindingConfig conf, Object... extBeans) {
if (currId < 0 || currId >= ledgerInitProperties.getConsensusParticipantCount()) {
prompter.info(
"Your participant id is illegal which is less than 1 or great than the total participants count[%s]!!!", "Your participant id is illegal which is less than 1 or great than the total participants count[%s]!!!",
ledgerSetting.getConsensusParticipantCount());
ledgerInitProperties.getConsensusParticipantCount());
return null; return null;
} }


// generate binding config; // generate binding config;
BindingConfig bindingConf = new BindingConfig(); BindingConfig bindingConf = new BindingConfig();
// bindingConf.setCsConfigFile(localConf.getConsensusConfig());
bindingConf.getParticipant().setAddress(ledgerSetting.getConsensusParticipant(currId).getAddress());
bindingConf.getParticipant().setAddress(ledgerInitProperties.getConsensusParticipant(currId).getAddress());
String encodedPrivKey = KeyGenCommand.encodePrivKey(privKey, base58Pwd); String encodedPrivKey = KeyGenCommand.encodePrivKey(privKey, base58Pwd);
bindingConf.getParticipant().setPk(encodedPrivKey); bindingConf.getParticipant().setPk(encodedPrivKey);
bindingConf.getParticipant().setPassword(base58Pwd); bindingConf.getParticipant().setPassword(base58Pwd);
@@ -185,16 +174,13 @@ public class LedgerInitCommand {
bindingConf.getDbConnection().setConnectionUri(dbConnConfig.getUri()); bindingConf.getDbConnection().setConnectionUri(dbConnConfig.getUri());
bindingConf.getDbConnection().setPassword(dbConnConfig.getPassword()); bindingConf.getDbConnection().setPassword(dbConnConfig.getPassword());


// bindingConf.getMqConnection().setServer(mqConnConfig.getServer());
// bindingConf.getMqConnection().setTopic(mqConnConfig.getTopic());

// confirm continue; // confirm continue;
prompter.info("\r\n\r\n This is participant [%s], the ledger initialization is ready to start!\r\n", currId); prompter.info("\r\n\r\n This is participant [%s], the ledger initialization is ready to start!\r\n", currId);
// ConsoleUtils.confirm("Press any key to continue... ");
// prompter.confirm("Press any key to continue... ");
// ConsoleUtils.confirm("Press any key to continue... ");
// prompter.confirm("Press any key to continue... ");


// start web listener;
NetworkAddress serverAddress = ledgerSetting.getConsensusParticipant(currId).getInitializerAddress();
// start the web controller of Ledger Initializer;
NetworkAddress serverAddress = ledgerInitProperties.getConsensusParticipant(currId).getInitializerAddress();
String argServerAddress = String.format("--server.address=%s", serverAddress.getHost()); String argServerAddress = String.format("--server.address=%s", serverAddress.getHost());
String argServerPort = String.format("--server.port=%s", serverAddress.getPort()); String argServerPort = String.format("--server.port=%s", serverAddress.getPort());
String[] innerArgs = { argServerAddress, argServerPort }; String[] innerArgs = { argServerAddress, argServerPort };
@@ -211,21 +197,21 @@ public class LedgerInitCommand {
ConfigurableApplicationContext ctx = app.run(innerArgs); ConfigurableApplicationContext ctx = app.run(innerArgs);
this.ledgerManager = ctx.getBean(LedgerManager.class); this.ledgerManager = ctx.getBean(LedgerManager.class);


prompter.info("\r\n------ Web listener[%s:%s] was started. ------\r\n", serverAddress.getHost(),
serverAddress.getPort());
prompter.info("\r\n------ Web controller of Ledger Initializer[%s:%s] was started. ------\r\n",
serverAddress.getHost(), serverAddress.getPort());


try { try {
LedgerInitProcess initProc = ctx.getBean(LedgerInitProcess.class); LedgerInitProcess initProc = ctx.getBean(LedgerInitProcess.class);
HashDigest ledgerHash = initProc.initialize(currId, privKey, ledgerSetting, csSettings, csProvider,
HashDigest ledgerHash = initProc.initialize(currId, privKey, ledgerInitProperties,
bindingConf.getDbConnection(), prompter); bindingConf.getDbConnection(), prompter);


if (ledgerHash == null) { if (ledgerHash == null) {
// ledger init fail; // ledger init fail;
ConsoleUtils.error("\r\n------ Ledger initialize fail! ------\r\n");
prompter.error("\r\n------ Ledger initialize fail! ------\r\n");
return null; return null;
} else { } else {
ConsoleUtils.info("\r\n------ Ledger initialize success! ------");
ConsoleUtils.info("New Ledger Hash is :[%s]", ledgerHash.toBase58());
prompter.info("\r\n------ Ledger initialize success! ------");
prompter.info("New Ledger Hash is :[%s]", ledgerHash.toBase58());


if (conf == null) { if (conf == null) {
conf = new LedgerBindingConfig(); conf = new LedgerBindingConfig();
@@ -237,7 +223,7 @@ public class LedgerInitCommand {
} }
} finally { } finally {
ctx.close(); ctx.close();
ConsoleUtils.info("\r\n------ Web listener[%s:%s] was closed. ------\r\n", serverAddress.getHost(),
prompter.info("\r\n------ Web listener[%s:%s] was closed. ------\r\n", serverAddress.getHost(),
serverAddress.getPort()); serverAddress.getPort());
} }
} }


+ 5
- 23
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProcess.java View File

@@ -17,44 +17,26 @@ public interface LedgerInitProcess {
/** /**
* Init a new ledger; * Init a new ledger;
* *
* @param currentId
* @param privKey
* @param ledgerInitProps
* 账本初始化配置属性;
* @param consensusSettings
* 共识配置属性;
* @param consensusServiceProvider
* @param prompter
* @return 返回新账本的 hash;如果未初始化成功,则返回 null;
*/
/**
* Init a new ledger;
* @param currentId Id of current participant;
* @param privKey Private key of current participant;
* @param ledgerInitProps The settings about this initialization;
* @param consensusSettings The consensus settings
* @param consensusProvider
* @param dbConnConfig
* @param prompter
* @param currentId Id of current participant.
* @param privKey Private key of current participant.
* @param ledgerInitProps The settings about this initialization.
* @param dbConnConfig The configuration of DB Connection.
* @param prompter Prompter for interaction.
* @return * @return
*/ */
HashDigest initialize(int currentId, PrivKey privKey, LedgerInitProperties ledgerInitProps, HashDigest initialize(int currentId, PrivKey privKey, LedgerInitProperties ledgerInitProps,
ConsensusSettings consensusSettings, ConsensusProvider consensusProvider,
DBConnectionConfig dbConnConfig, Prompter prompter); DBConnectionConfig dbConnConfig, Prompter prompter);


/** /**
* @param currentId * @param currentId
* @param privKey * @param privKey
* @param ledgerInitProps * @param ledgerInitProps
* @param consensusSettings
* @param consensusProvider
* @param dbConnConfig * @param dbConnConfig
* @param prompter * @param prompter
* @param cryptoSetting * @param cryptoSetting
* @return * @return
*/ */
HashDigest initialize(int currentId, PrivKey privKey, LedgerInitProperties ledgerInitProps, HashDigest initialize(int currentId, PrivKey privKey, LedgerInitProperties ledgerInitProps,
ConsensusSettings consensusSettings, ConsensusProvider consensusProvider,
DBConnectionConfig dbConnConfig, Prompter prompter, CryptoSetting cryptoSetting); DBConnectionConfig dbConnConfig, Prompter prompter, CryptoSetting cryptoSetting);


} }

+ 85
- 122
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java View File

@@ -1,23 +1,23 @@
package com.jd.blockchain.tools.initializer; package com.jd.blockchain.tools.initializer;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Properties; import java.util.Properties;


import org.springframework.util.ResourceUtils;

import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.AddressEncoding;
import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.ledger.ParticipantNode;
import com.jd.blockchain.tools.keygen.KeyGenCommand; import com.jd.blockchain.tools.keygen.KeyGenCommand;
import com.jd.blockchain.utils.PropertiesUtils;
import com.jd.blockchain.utils.codec.HexUtils; import com.jd.blockchain.utils.codec.HexUtils;
import com.jd.blockchain.utils.io.FileUtils; import com.jd.blockchain.utils.io.FileUtils;
import com.jd.blockchain.utils.net.NetworkAddress; import com.jd.blockchain.utils.net.NetworkAddress;


import org.springframework.core.io.ClassPathResource;

public class LedgerInitProperties { public class LedgerInitProperties {


// 账本种子; // 账本种子;
@@ -32,12 +32,7 @@ public class LedgerInitProperties {
public static final String PART_PUBKEY_PATH = "pubkey-path"; public static final String PART_PUBKEY_PATH = "pubkey-path";
// 参与方的公钥文件路径; // 参与方的公钥文件路径;
public static final String PART_PUBKEY = "pubkey"; public static final String PART_PUBKEY = "pubkey";
// //共识参与方的共识服务的主机地址;
// public static final String PART_CONSENSUS_HOST = "consensus.host";
// // 共识参与方的共识服务的端口;
// public static final String PART_CONSENSUS_PORT = "consensus.port";
// // 共识参与方的共识服务是否开启安全连接;
// public static final String PART_CONSENSUS_SECURE = "consensus.secure";

// 共识参与方的账本初始服务的主机; // 共识参与方的账本初始服务的主机;
public static final String PART_INITIALIZER_HOST = "initializer.host"; public static final String PART_INITIALIZER_HOST = "initializer.host";
// 共识参与方的账本初始服务的端口; // 共识参与方的账本初始服务的端口;
@@ -45,70 +40,37 @@ public class LedgerInitProperties {
// 共识参与方的账本初始服务是否开启安全连接; // 共识参与方的账本初始服务是否开启安全连接;
public static final String PART_INITIALIZER_SECURE = "initializer.secure"; public static final String PART_INITIALIZER_SECURE = "initializer.secure";


// 共识服务的参数配置;必须;
public static final String CONSENSUS_CONFIG = "consensus.conf";

// 共识服务提供者;必须;
public static final String CONSENSUS_SERVICE_PROVIDER = "consensus.service-provider";

// 密码服务提供者列表,以英文逗点“,”分隔;必须;
public static final String CRYPTO_SERVICE_PROVIDERS = "crypto.service-providers";

public static final String CRYPTO_SERVICE_PROVIDERS_SPLITTER = ",";

private byte[] ledgerSeed; private byte[] ledgerSeed;


private List<ConsensusParticipantConfig> consensusParticipants = new ArrayList<>(); private List<ConsensusParticipantConfig> consensusParticipants = new ArrayList<>();


private String consensusProvider;

private Properties consensusConfig;

private String[] cryptoProviders;

public byte[] getLedgerSeed() { public byte[] getLedgerSeed() {
return ledgerSeed;
return ledgerSeed.clone();
} }


public static byte[] getHostSettingValue() throws Exception {
ClassPathResource hostConfigResource = new ClassPathResource("hosts.config");
InputStream fis = hostConfigResource.getInputStream();
ByteArrayOutputStream bos = null;
byte[] buffer = null;
try {
bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
// host file to bytes
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
throw new Exception(e.getMessage(), e);
} catch (IOException e) {
throw new Exception(e.getMessage(), e);
} finally {
if (fis != null) {
fis.close();
}
if (bos != null) {
bos.close();
}
}
return buffer;
public Properties getConsensusConfig() {
return consensusConfig;
} }


public static byte[] getSystemSettingValue() throws Exception {
ClassPathResource systemConfigResource = new ClassPathResource("bftsmart.config");
InputStream fis = systemConfigResource.getInputStream();
ByteArrayOutputStream bos = null;
byte[] buffer = null;
try {
bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
// file to bytes
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
throw new Exception(e.getMessage(), e);
} catch (IOException e) {
throw new Exception(e.getMessage(), e);
} finally {
if (fis != null) {
fis.close();
}
if (bos != null) {
bos.close();
}
}
return buffer;
public String getConsensusProvider() {
return consensusProvider;
} }


public int getConsensusParticipantCount() { public int getConsensusParticipantCount() {
@@ -118,21 +80,24 @@ public class LedgerInitProperties {
public List<ConsensusParticipantConfig> getConsensusParticipants() { public List<ConsensusParticipantConfig> getConsensusParticipants() {
return consensusParticipants; return consensusParticipants;
} }

public ConsensusParticipantConfig[] getConsensusParticipantArray() {
return consensusParticipants.toArray(new ConsensusParticipantConfig[consensusParticipants.size()]);
public String[] getCryptoProviders() {
return cryptoProviders.clone();
}
public void setCryptoProviders(String[] cryptoProviders) {
this.cryptoProviders = cryptoProviders;
} }


/** /**
* 返回参与者; * 返回参与者;
* *
* @param address
* 从 1 开始; 小于等于 {@link #getConsensusParticipantCount()};
* @param address 从 1 开始; 小于等于 {@link #getConsensusParticipantCount()};
* @return * @return
*/ */
public ConsensusParticipantConfig getConsensusParticipant(int id) { public ConsensusParticipantConfig getConsensusParticipant(int id) {
for (ConsensusParticipantConfig p : consensusParticipants) { for (ConsensusParticipantConfig p : consensusParticipants) {
if (p.getId()== id) {
if (p.getId() == id) {
return p; return p;
} }
} }
@@ -163,11 +128,31 @@ public class LedgerInitProperties {
} }


private static LedgerInitProperties resolve(Properties props) { private static LedgerInitProperties resolve(Properties props) {
String hexLedgerSeed = getProperty(props, LEDGER_SEED).replace("-", "");
String hexLedgerSeed = PropertiesUtils.getRequiredProperty(props, LEDGER_SEED).replace("-", "");
byte[] ledgerSeed = HexUtils.decode(hexLedgerSeed); byte[] ledgerSeed = HexUtils.decode(hexLedgerSeed);
LedgerInitProperties setting = new LedgerInitProperties(ledgerSeed);
LedgerInitProperties initProps = new LedgerInitProperties(ledgerSeed);

// 解析共识相关的属性;
initProps.consensusProvider = PropertiesUtils.getRequiredProperty(props, CONSENSUS_SERVICE_PROVIDER);
String consensusConfigFilePath = PropertiesUtils.getRequiredProperty(props, CONSENSUS_CONFIG);
try {
File consensusConfigFile = ResourceUtils.getFile(consensusConfigFilePath);
initProps.consensusConfig = FileUtils.readProperties(consensusConfigFile);
} catch (FileNotFoundException e) {
throw new IllegalArgumentException(
String.format("Consensus config file[%s] doesn't exist! ", consensusConfigFilePath), e);
}


int partCount = getInt(getProperty(props, PART_COUNT));
// 解析密码提供者列表;
String cryptoProviderNames = PropertiesUtils.getProperty(props, CRYPTO_SERVICE_PROVIDERS, true);
String[] cryptoProviders = cryptoProviderNames.split(CRYPTO_SERVICE_PROVIDERS_SPLITTER);
for (int i = 0; i < cryptoProviders.length; i++) {
cryptoProviders[i] = cryptoProviders[i].trim();
}
initProps.cryptoProviders = cryptoProviders;

// 解析参与方节点列表;
int partCount = getInt(PropertiesUtils.getRequiredProperty(props, PART_COUNT));
if (partCount < 0) { if (partCount < 0) {
throw new IllegalArgumentException(String.format("Property[%s] is negative!", PART_COUNT)); throw new IllegalArgumentException(String.format("Property[%s] is negative!", PART_COUNT));
} }
@@ -180,62 +165,40 @@ public class LedgerInitProperties {
parti.setId(i); parti.setId(i);


String nameKey = getKeyOfCsParti(i, PART_NAME); String nameKey = getKeyOfCsParti(i, PART_NAME);
parti.setName(getProperty(props, nameKey));
parti.setName(PropertiesUtils.getRequiredProperty(props, nameKey));


String pubkeyPathKey = getKeyOfCsParti(i, PART_PUBKEY_PATH); String pubkeyPathKey = getKeyOfCsParti(i, PART_PUBKEY_PATH);
parti.setPubKeyPath(getProperty(props, pubkeyPathKey));
String pubkeyPath = PropertiesUtils.getProperty(props, pubkeyPathKey, false);


String pubkeyKey = getKeyOfCsParti(i, PART_PUBKEY); String pubkeyKey = getKeyOfCsParti(i, PART_PUBKEY);
String base58PubKey = getProperty(props, pubkeyKey);
String base58PubKey = PropertiesUtils.getProperty(props, pubkeyKey, false);
if (base58PubKey != null) { if (base58PubKey != null) {
PubKey pubKey = KeyGenCommand.decodePubKey(base58PubKey); PubKey pubKey = KeyGenCommand.decodePubKey(base58PubKey);
parti.setPubKey(pubKey); parti.setPubKey(pubKey);
} else if (pubkeyPath != null) {
PubKey pubKey = KeyGenCommand.readPubKey(pubkeyPath);
parti.setPubKey(pubKey);
} else {
throw new IllegalArgumentException(
String.format("Property[%s] and property[%s] are all empty!", pubkeyKey, pubkeyPathKey));
} }


// String consensusHostKey = getKeyOfCsParti(i, PART_CONSENSUS_HOST);
// String consensusHost = getProperty(props, consensusHostKey);
//
// String consensusPortKey = getKeyOfCsParti(i, PART_CONSENSUS_PORT);
// int consensusPort = getInt(getProperty(props, consensusPortKey));
//
// String consensusSecureKey = getKeyOfCsParti(i, PART_CONSENSUS_SECURE);
// boolean consensusSecure = Boolean.parseBoolean(getProperty(props,
// consensusSecureKey));
// NetworkAddress consensusAddress = new NetworkAddress(consensusHost,
// consensusPort, consensusSecure);
// parti.setConsensusAddress(consensusAddress);

String initializerHostKey = getKeyOfCsParti(i, PART_INITIALIZER_HOST); String initializerHostKey = getKeyOfCsParti(i, PART_INITIALIZER_HOST);
String initializerHost = getProperty(props, initializerHostKey);
String initializerHost = PropertiesUtils.getRequiredProperty(props, initializerHostKey);


String initializerPortKey = getKeyOfCsParti(i, PART_INITIALIZER_PORT); String initializerPortKey = getKeyOfCsParti(i, PART_INITIALIZER_PORT);
int initializerPort = getInt(getProperty(props, initializerPortKey));
int initializerPort = getInt(PropertiesUtils.getRequiredProperty(props, initializerPortKey));


String initializerSecureKey = getKeyOfCsParti(i, PART_INITIALIZER_SECURE); String initializerSecureKey = getKeyOfCsParti(i, PART_INITIALIZER_SECURE);
boolean initializerSecure = Boolean.parseBoolean(getProperty(props, initializerSecureKey));
boolean initializerSecure = Boolean
.parseBoolean(PropertiesUtils.getRequiredProperty(props, initializerSecureKey));
NetworkAddress initializerAddress = new NetworkAddress(initializerHost, initializerPort, initializerSecure); NetworkAddress initializerAddress = new NetworkAddress(initializerHost, initializerPort, initializerSecure);
parti.setInitializerAddress(initializerAddress); parti.setInitializerAddress(initializerAddress);


setting.addConsensusParticipant(parti);
initProps.addConsensusParticipant(parti);
} }


return setting;
}

private static String getProperty(Properties props, String key) {
return getProperty(props, key, true);
}

private static String getProperty(Properties props, String key, boolean required) {
String value = props.getProperty(key);
if (value == null) {
if (required) {
throw new IllegalArgumentException("Miss property[" + key + "]!");
}
return null;
}
value = value.trim();
return value.length() == 0 ? null : value;
return initProps;
} }


private static int getInt(String strInt) { private static int getInt(String strInt) {
@@ -249,14 +212,14 @@ public class LedgerInitProperties {
* *
*/ */
public static class ConsensusParticipantConfig implements ParticipantNode { public static class ConsensusParticipantConfig implements ParticipantNode {
private int id; private int id;
private String address; private String address;


private String name; private String name;


private String pubKeyPath;
// private String pubKeyPath;


private PubKey pubKey; private PubKey pubKey;


@@ -271,7 +234,7 @@ public class LedgerInitProperties {
public void setId(int id) { public void setId(int id) {
this.id = id; this.id = id;
} }
@Override @Override
public String getAddress() { public String getAddress() {
return address; return address;
@@ -285,13 +248,13 @@ public class LedgerInitProperties {
this.name = name; this.name = name;
} }


public String getPubKeyPath() {
return pubKeyPath;
}
public void setPubKeyPath(String pubKeyPath) {
this.pubKeyPath = pubKeyPath;
}
// public String getPubKeyPath() {
// return pubKeyPath;
// }
//
// public void setPubKeyPath(String pubKeyPath) {
// this.pubKeyPath = pubKeyPath;
// }


public NetworkAddress getInitializerAddress() { public NetworkAddress getInitializerAddress() {
return initializerAddress; return initializerAddress;


+ 7
- 57
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LocalConfig.java View File

@@ -2,8 +2,6 @@ package com.jd.blockchain.tools.initializer;


import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.net.URI;
import java.nio.file.Path;
import java.util.Properties; import java.util.Properties;


import com.jd.blockchain.utils.PathUtils; import com.jd.blockchain.utils.PathUtils;
@@ -30,17 +28,11 @@ public class LocalConfig {
// 账本数据库的连接口令; // 账本数据库的连接口令;
public static final String LEDGER_DB_PWD = "ledger.db.pwd"; public static final String LEDGER_DB_PWD = "ledger.db.pwd";


// 账本消息队列的地址
// public static final String LEDGER_MQ_SERVER = "ledger.mq.server";
//
// // 账本消息队列的主题
// public static final String LEDGER_MQ_TOPIC = "ledger.mq.topic";

// 共识系统的参数配置;必须参数;
public static final String CONSENSUS_CONF = "consensus.conf";
// 共识系统的参数配置;必须参数;
public static final String CONSENSUS_SERVICE_PROVIDER = "consensus.service-provider";
// // 共识系统的参数配置;必须参数;
// public static final String CONSENSUS_CONF = "consensus.conf";
//
// // 共识系统的参数配置;必须参数;
// public static final String CONSENSUS_SERVICE_PROVIDER = "consensus.service-provider";


private LocalParticipantConfig local = new LocalParticipantConfig(); private LocalParticipantConfig local = new LocalParticipantConfig();


@@ -48,10 +40,9 @@ public class LocalConfig {


private DBConnectionConfig storagedDb = new DBConnectionConfig(); private DBConnectionConfig storagedDb = new DBConnectionConfig();


// private MQConnectionConfig handleMq = new MQConnectionConfig();


private String consensusConfig;
private String consensusProvider;
// private String consensusConfig;
// private String consensusProvider;


public LocalParticipantConfig getLocal() { public LocalParticipantConfig getLocal() {
return local; return local;
@@ -77,22 +68,6 @@ public class LocalConfig {
this.storagedDb = storagedDb; this.storagedDb = storagedDb;
} }


// public MQConnectionConfig getHandleMq() {
// return handleMq;
// }
//
// public void setHandleMq(MQConnectionConfig handleMq) {
// this.handleMq = handleMq;
// }

public String getConsensusConfig() {
return consensusConfig;
}

public void setConsensusConfig(String consensusConfig) {
this.consensusConfig = consensusConfig;
}

public static LocalConfig resolve(String initSettingFile) { public static LocalConfig resolve(String initSettingFile) {
Properties props = FileUtils.readProperties(initSettingFile, "UTF-8"); Properties props = FileUtils.readProperties(initSettingFile, "UTF-8");
return resolve(props, initSettingFile); return resolve(props, initSettingFile);
@@ -118,17 +93,12 @@ public class LocalConfig {


if (initSettingFile == null) { if (initSettingFile == null) {
conf.bindingOutDir = PropertiesUtils.getRequiredProperty(props, LEDGER_BINDING_OUT); conf.bindingOutDir = PropertiesUtils.getRequiredProperty(props, LEDGER_BINDING_OUT);
conf.consensusConfig = PropertiesUtils.getRequiredProperty(props, CONSENSUS_CONF);
} else { } else {
String bindingOutDir = PropertiesUtils.getRequiredProperty(props, LEDGER_BINDING_OUT); String bindingOutDir = PropertiesUtils.getRequiredProperty(props, LEDGER_BINDING_OUT);
String consensusConfig = PropertiesUtils.getRequiredProperty(props, CONSENSUS_CONF);
String initSettingDir = PathUtils.concatPaths(initSettingFile, "../"); String initSettingDir = PathUtils.concatPaths(initSettingFile, "../");
conf.bindingOutDir = absolutePath(initSettingDir, bindingOutDir); conf.bindingOutDir = absolutePath(initSettingDir, bindingOutDir);
conf.consensusConfig = absolutePath(initSettingDir, consensusConfig);
} }


conf.consensusProvider = PropertiesUtils.getRequiredProperty(props, CONSENSUS_SERVICE_PROVIDER);

return conf; return conf;
} }


@@ -141,18 +111,6 @@ public class LocalConfig {
return absolutePath; return absolutePath;
} }


private static int getInt(String strInt) {
return Integer.parseInt(strInt.trim());
}

public String getConsensusProvider() {
return consensusProvider;
}

public void setConsensusProvider(String consensusProvider) {
this.consensusProvider = consensusProvider;
}

/** /**
* 当前参与方的本地配置信息; * 当前参与方的本地配置信息;
* *
@@ -192,12 +150,4 @@ public class LocalConfig {


} }


public static void main(String[] args) {
String currPath = "/Users/zhanglin33/Ddisk/20mintest/0/config/init/local.conf";
// String settingPath = "../";
String settingPath = "bftsmart.config";
String path = absolutePath(PathUtils.concatPaths(currPath, "../"), settingPath);
System.out.println(path);

}
} }

+ 22
- 0
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/Prompter.java View File

@@ -2,6 +2,28 @@ package com.jd.blockchain.tools.initializer;


public interface Prompter { public interface Prompter {
//定义一些常用的问答常量;

/**
* 询问是或否;
*/
public static final String QUESTION_YESNO = "YES/NO";

/**
* 提示按任意键继续;
*/
public static final String PROMPT_ANYKEY_TO_CONTINUE = "ANYKEY";

/**
*
*/
public static final String ANSWER_YES = "Y";

public static final String ANSWER_NO = "N";
void info(String format, Object... args); void info(String format, Object... args);


void error(String format, Object... args); void error(String format, Object... args);


+ 69
- 33
source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/web/LedgerInitializeWebController.java View File

@@ -5,6 +5,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Properties;
import java.util.Random; import java.util.Random;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -18,14 +19,17 @@ import org.springframework.web.bind.annotation.RestController;


import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.binaryproto.DataContractRegistry;
import com.jd.blockchain.consensus.ConsensusProvider; import com.jd.blockchain.consensus.ConsensusProvider;
import com.jd.blockchain.consensus.ConsensusProviders;
import com.jd.blockchain.consensus.ConsensusSettings; import com.jd.blockchain.consensus.ConsensusSettings;
import com.jd.blockchain.crypto.CryptoAlgorithm;
import com.jd.blockchain.crypto.Crypto; import com.jd.blockchain.crypto.Crypto;
import com.jd.blockchain.crypto.CryptoProvider;
import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.HashDigest;
import com.jd.blockchain.crypto.PrivKey; import com.jd.blockchain.crypto.PrivKey;
import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.crypto.PubKey;
import com.jd.blockchain.crypto.SignatureDigest; import com.jd.blockchain.crypto.SignatureDigest;
import com.jd.blockchain.crypto.SignatureFunction; import com.jd.blockchain.crypto.SignatureFunction;
import com.jd.blockchain.crypto.service.classic.ClassicCryptoService;
import com.jd.blockchain.crypto.service.sm.SMCryptoService;
import com.jd.blockchain.ledger.BlockchainIdentity; import com.jd.blockchain.ledger.BlockchainIdentity;
import com.jd.blockchain.ledger.BlockchainIdentityData; import com.jd.blockchain.ledger.BlockchainIdentityData;
import com.jd.blockchain.ledger.CryptoSetting; import com.jd.blockchain.ledger.CryptoSetting;
@@ -53,11 +57,11 @@ import com.jd.blockchain.tools.initializer.LedgerInitException;
import com.jd.blockchain.tools.initializer.LedgerInitProcess; import com.jd.blockchain.tools.initializer.LedgerInitProcess;
import com.jd.blockchain.tools.initializer.LedgerInitProperties; import com.jd.blockchain.tools.initializer.LedgerInitProperties;
import com.jd.blockchain.tools.initializer.LedgerInitProperties.ConsensusParticipantConfig; import com.jd.blockchain.tools.initializer.LedgerInitProperties.ConsensusParticipantConfig;
import com.jd.blockchain.tools.initializer.Prompter;
import com.jd.blockchain.transaction.DigitalSignatureBlob; import com.jd.blockchain.transaction.DigitalSignatureBlob;
import com.jd.blockchain.transaction.LedgerInitSettingData; import com.jd.blockchain.transaction.LedgerInitSettingData;
import com.jd.blockchain.transaction.TxBuilder; import com.jd.blockchain.transaction.TxBuilder;
import com.jd.blockchain.transaction.TxRequestBuilder; import com.jd.blockchain.transaction.TxRequestBuilder;
import com.jd.blockchain.tools.initializer.Prompter;
import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.Bytes;
import com.jd.blockchain.utils.concurrent.InvocationResult; import com.jd.blockchain.utils.concurrent.InvocationResult;
import com.jd.blockchain.utils.io.BytesUtils; import com.jd.blockchain.utils.io.BytesUtils;
@@ -76,8 +80,11 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
DataContractRegistry.register(TransactionRequest.class); DataContractRegistry.register(TransactionRequest.class);
} }


private static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(),
SMCryptoService.class.getName() };

private static final String DEFAULT_SIGN_ALGORITHM = "ED25519"; private static final String DEFAULT_SIGN_ALGORITHM = "ED25519";
private final SignatureFunction SIGN_FUNC; private final SignatureFunction SIGN_FUNC;


private volatile LedgerInitPermission localPermission; private volatile LedgerInitPermission localPermission;
@@ -122,7 +129,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
public LedgerInitializeWebController(LedgerManage ledgerManager, DbConnectionFactory dbConnFactory, public LedgerInitializeWebController(LedgerManage ledgerManager, DbConnectionFactory dbConnFactory,
InitConsensusServiceFactory initCsServiceFactory) { InitConsensusServiceFactory initCsServiceFactory) {
this.SIGN_FUNC = Crypto.getSignatureFunction(DEFAULT_SIGN_ALGORITHM); this.SIGN_FUNC = Crypto.getSignatureFunction(DEFAULT_SIGN_ALGORITHM);
this.ledgerManager = ledgerManager; this.ledgerManager = ledgerManager;
this.dbConnFactory = dbConnFactory; this.dbConnFactory = dbConnFactory;
this.initCsServiceFactory = initCsServiceFactory; this.initCsServiceFactory = initCsServiceFactory;
@@ -148,36 +155,39 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
this.prompter = prompter; this.prompter = prompter;
} }


public ConsensusProvider getConsensusProvider() {
return consensusProvider;
}
// private ConsensusProvider getConsensusProvider() {
// return consensusProvider;
// }


public void setConsensusProvider(ConsensusProvider consensusProvider) {
private void setConsensusProvider(ConsensusProvider consensusProvider) {
this.consensusProvider = consensusProvider; this.consensusProvider = consensusProvider;
} }


@Override @Override
public HashDigest initialize(int currentId, PrivKey privKey, LedgerInitProperties ledgerInitProps, public HashDigest initialize(int currentId, PrivKey privKey, LedgerInitProperties ledgerInitProps,
ConsensusSettings csSettings, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter) {
return initialize(currentId, privKey, ledgerInitProps, csSettings, csProvider, dbConnConfig, prompter,
createDefaultCryptoSetting());
DBConnectionConfig dbConnConfig, Prompter prompter) {
return initialize(currentId, privKey, ledgerInitProps, dbConnConfig, prompter, createDefaultCryptoSetting());
} }


@Override @Override
public HashDigest initialize(int currentId, PrivKey privKey, LedgerInitProperties ledgerInitProps, public HashDigest initialize(int currentId, PrivKey privKey, LedgerInitProperties ledgerInitProps,
ConsensusSettings consensusProps, ConsensusProvider csProvider, DBConnectionConfig dbConnConfig,
Prompter prompter, CryptoSetting cryptoSetting) {
DBConnectionConfig dbConnConfig, Prompter prompter, CryptoSetting cryptoSetting) {


if (this.ledgerInitSetting != null) { if (this.ledgerInitSetting != null) {
throw new IllegalStateException("ledger init process has already started."); throw new IllegalStateException("ledger init process has already started.");
} }


setPrompter(prompter); setPrompter(prompter);

Properties csProps = ledgerInitProps.getConsensusConfig();
ConsensusProvider csProvider = ConsensusProviders.getProvider(ledgerInitProps.getConsensusProvider());
ConsensusSettings csSettings = csProvider.getSettingsFactory().getConsensusSettingsBuilder()
.createSettings(csProps);
setConsensusProvider(csProvider); setConsensusProvider(csProvider);

prompter.info("Init settings and sign permision..."); prompter.info("Init settings and sign permision...");


prepareLocalPermission(currentId, privKey, ledgerInitProps, consensusProps, cryptoSetting);
prepareLocalPermission(currentId, privKey, ledgerInitProps, csSettings, cryptoSetting);


prompter.confirm(InitializingStep.PERMISSION_READY.toString(), prompter.confirm(InitializingStep.PERMISSION_READY.toString(),
"Ledger init permission has already prepared! Any key to continue..."); "Ledger init permission has already prepared! Any key to continue...");
@@ -230,7 +240,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
this.decisions[i] = new DecisionResultHandle(i); this.decisions[i] = new DecisionResultHandle(i);
} }
// 预置当前参与方的“决定”到列表,避免向自己发起请求; // 预置当前参与方的“决定”到列表,避免向自己发起请求;
this.decisions[currentId].setResult(localDecision);
this.decisions[currentId].setValue(localDecision);
return localDecision; return localDecision;
} }


@@ -299,7 +309,12 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
} }


public CryptoSetting createDefaultCryptoSetting() { public CryptoSetting createDefaultCryptoSetting() {
CryptoProvider[] supportedProviders = new CryptoProvider[SUPPORTED_PROVIDERS.length];
for (int i = 0; i < SUPPORTED_PROVIDERS.length; i++) {
supportedProviders[i] = Crypto.getProvider(SUPPORTED_PROVIDERS[i]);
}
CryptoConfig defCryptoSetting = new CryptoConfig(); CryptoConfig defCryptoSetting = new CryptoConfig();
defCryptoSetting.setSupportedProviders(supportedProviders);
defCryptoSetting.setAutoVerifyHash(true); defCryptoSetting.setAutoVerifyHash(true);
defCryptoSetting.setHashAlgorithm(Crypto.getAlgorithm("SHA256")); defCryptoSetting.setHashAlgorithm(Crypto.getAlgorithm("SHA256"));


@@ -318,7 +333,9 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
LedgerInitSettingData initSetting = new LedgerInitSettingData(); LedgerInitSettingData initSetting = new LedgerInitSettingData();
initSetting.setLedgerSeed(ledgerProps.getLedgerSeed()); initSetting.setLedgerSeed(ledgerProps.getLedgerSeed());
initSetting.setCryptoSetting(cryptoSetting); initSetting.setCryptoSetting(cryptoSetting);
ConsensusParticipantConfig[] parties = ledgerProps.getConsensusParticipantArray();

List<ConsensusParticipantConfig> partiList = ledgerProps.getConsensusParticipants();
ConsensusParticipantConfig[] parties = partiList.toArray(new ConsensusParticipantConfig[partiList.size()]);
ConsensusParticipantConfig[] orderedParties = sortAndVerify(parties); ConsensusParticipantConfig[] orderedParties = sortAndVerify(parties);
initSetting.setConsensusParticipants(orderedParties); initSetting.setConsensusParticipants(orderedParties);


@@ -447,7 +464,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
List<String> waitingIds = new ArrayList<>(); List<String> waitingIds = new ArrayList<>();
for (int i = 0; i < results.length; i++) { for (int i = 0; i < results.length; i++) {
if (results[i] != null) { if (results[i] != null) {
if (results[i].getResult() == null) {
if (results[i].getValue() == null) {
waitingIds.add("" + (i + 1)); waitingIds.add("" + (i + 1));
} }
} }
@@ -474,7 +491,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
continue; continue;
} }
PubKey pubKey = participants[i].getPubKey(); PubKey pubKey = participants[i].getPubKey();
LedgerInitPermission permission = (LedgerInitPermission) results[i].getResult();
LedgerInitPermission permission = (LedgerInitPermission) results[i].getValue();
if (permission.getParticipantId() != participants[i].getId()) { if (permission.getParticipantId() != participants[i].getId()) {
prompter.error("\r\nThe id of received permission isn't equal to it's participant ! --[Id=%s][name=%s]", prompter.error("\r\nThe id of received permission isn't equal to it's participant ! --[Id=%s][name=%s]",
participants[i].getAddress(), participants[i].getName()); participants[i].getAddress(), participants[i].getName());
@@ -525,7 +542,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
public void run() { public void run() {
try { try {
LedgerInitPermission permission = initConsensus.requestPermission(currentId, reqAuthSign); LedgerInitPermission permission = initConsensus.requestPermission(currentId, reqAuthSign);
result.setResult(permission);
result.setValue(permission);
} catch (Exception e) { } catch (Exception e) {
result.setError(e); result.setError(e);
} finally { } finally {
@@ -595,7 +612,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
while (!allDecided) { while (!allDecided) {
allDecided = true; allDecided = true;
for (int i = 0; i < randDecHdls.length; i++) { for (int i = 0; i < randDecHdls.length; i++) {
if (randDecHdls[i].getResult() != null) {
if (randDecHdls[i].getValue() != null) {
// 忽略当前参与方自己(在初始化“决定”时已经置为非空),以及已经收到主动提交“决定”的参与方; // 忽略当前参与方自己(在初始化“决定”时已经置为非空),以及已经收到主动提交“决定”的参与方;
continue; continue;
} }
@@ -636,10 +653,11 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
try { try {
targetDecision = initConsensus.synchronizeDecision(localDecision); targetDecision = initConsensus.synchronizeDecision(localDecision);
} catch (Exception e1) { } catch (Exception e1) {
prompter.info("Error occurred on synchronizing decision . --%s", e1.getMessage());
prompter.info("Error occurred on synchronizing decision . --[%s] %s", e1.getClass().getName(),
e1.getMessage());
} }
if (targetDecision == null) { if (targetDecision == null) {
if (resultHandle.getResult() != null) {
if (resultHandle.getValue() != null) {
// 已经验证过; // 已经验证过;
return true; return true;
} }
@@ -666,7 +684,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
} }
} while (targetDecision == null); } while (targetDecision == null);


if (targetDecision.getParticipantId() != targetId && resultHandle.getResult() == null) {
if (targetDecision.getParticipantId() != targetId && resultHandle.getValue() == null) {
prompter.error( prompter.error(
"The received id of participant isn't equal to id of request target participant! --[Id=%s]", "The received id of participant isn't equal to id of request target participant! --[Id=%s]",
targetId); targetId);
@@ -684,7 +702,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
/** /**
* 校验并记录指定的参与方做出的决定; * 校验并记录指定的参与方做出的决定;
* <p> * <p>
* 注:对 {@link DecisionResultHandle#setResult(LedgerInitDecision)}
* 注:对 {@link DecisionResultHandle#setValue(LedgerInitDecision)}
* 方法的调用不是线程安全的,但由于是在满足有效性校验之后才调用,具有幂等性,所以不必对该方法的多处调用进行同步; * 方法的调用不是线程安全的,但由于是在满足有效性校验之后才调用,具有幂等性,所以不必对该方法的多处调用进行同步;
* *
* @param targetDecision * @param targetDecision
@@ -695,7 +713,7 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
private synchronized boolean validateAndRecordDecision(LedgerInitDecision targetDecision, private synchronized boolean validateAndRecordDecision(LedgerInitDecision targetDecision,
DecisionResultHandle resultHandle) { DecisionResultHandle resultHandle) {
if ((!localDecision.getLedgerHash().equals(targetDecision.getLedgerHash())) if ((!localDecision.getLedgerHash().equals(targetDecision.getLedgerHash()))
&& resultHandle.getResult() == null) {
&& resultHandle.getValue() == null) {
// 如果结果已经被 // 如果结果已经被
prompter.error( prompter.error(
"The received ledger hash of participant isn't equal to ledger hash of current participant! --[Id=%s]", "The received ledger hash of participant isn't equal to ledger hash of current participant! --[Id=%s]",
@@ -708,13 +726,13 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
.getPubKey(); .getPubKey();
byte[] deciBytes = getDecisionBytes(targetDecision.getParticipantId(), targetDecision.getLedgerHash()); byte[] deciBytes = getDecisionBytes(targetDecision.getParticipantId(), targetDecision.getLedgerHash());
if ((!SIGN_FUNC.verify(targetDecision.getSignature(), targetPubKey, deciBytes)) if ((!SIGN_FUNC.verify(targetDecision.getSignature(), targetPubKey, deciBytes))
&& resultHandle.getResult() == null) {
&& resultHandle.getValue() == null) {
prompter.error("The signature of received decision is invalid! --[Id=%s]", prompter.error("The signature of received decision is invalid! --[Id=%s]",
targetDecision.getParticipantId()); targetDecision.getParticipantId());
return false; return false;
} }


resultHandle.setResult(targetDecision);
resultHandle.setValue(targetDecision);
return true; return true;
} }


@@ -723,20 +741,38 @@ public class LedgerInitializeWebController implements LedgerInitProcess, LedgerI
public LedgerInitDecision synchronizeDecision(@RequestBody LedgerInitDecision initDecision) { public LedgerInitDecision synchronizeDecision(@RequestBody LedgerInitDecision initDecision) {
int remoteId = initDecision.getParticipantId(); int remoteId = initDecision.getParticipantId();
if (remoteId == currentId) { if (remoteId == currentId) {
prompter.error("Reject decision because of self-synchronization! --[Id=%s]", remoteId);
throw new LedgerInitException( throw new LedgerInitException(
String.format("Reject decision because of self-synchronization! --[Id=%s]", remoteId)); String.format("Reject decision because of self-synchronization! --[Id=%s]", remoteId));
} }

if (this.genesisBlock == null) { if (this.genesisBlock == null) {
// 当前参与者尚未准备就绪,返回 null; // 当前参与者尚未准备就绪,返回 null;
prompter.info("Not ready for genesis block! --[RemoteId=%s][CurrentId=%s]", remoteId, currentId);
return null; return null;
} }
DecisionResultHandle resultHandle = this.decisions[remoteId];
if (!validateAndRecordDecision(initDecision, resultHandle)) {
// 签名无效;

prompter.info("Received request of synchronizing decision! --[RemoteId=%s][CurrentId=%s]", remoteId, currentId);

try {
DecisionResultHandle resultHandle = this.decisions[remoteId];
if (!validateAndRecordDecision(initDecision, resultHandle)) {
// 签名无效;
prompter.error("Reject decision because of invalid signature! --[RemoteId=%s][CurrentId=%s]", remoteId,
currentId);
throw new LedgerInitException(
String.format("Reject decision because of invalid signature! --[RemoteId=%s][CurrentId=%s]",
remoteId, currentId));
}
return localDecision;
} catch (Exception e) {
prompter.error(e,
"Error occurred while receiving the request of synchronizing decision! --[RemoteId=%s][CurrentId=%s] %s",
remoteId, currentId, e.getMessage());
throw new LedgerInitException( throw new LedgerInitException(
String.format("Reject decision because of invalid signature! --[Id=%s]", remoteId));
"Error occurred while receiving the request of synchronizing decision! --" + e.getMessage(), e);
} }
return localDecision;
} }


/** /**


+ 0
- 7
source/tools/tools-initializer/src/main/resources/local.conf View File

@@ -16,10 +16,3 @@ ledger.db.uri=redis://127.0.0.1/0


#账本数据库的连接口令; #账本数据库的连接口令;
ledger.db.pwd= ledger.db.pwd=

#共识协议的参数配置;必须参数;
consensus.conf=mq.config

#共识协议的实现类型;必须参数;
consensus.service-provider=com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider


+ 1
- 9
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/ArrayUtils.java View File

@@ -1,14 +1,7 @@
package com.jd.blockchain.utils; package com.jd.blockchain.utils;
import java.lang.reflect.Array; import java.lang.reflect.Array;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import java.util.*;
/** /**
* @author haiq * @author haiq
@@ -83,5 +76,4 @@ public abstract class ArrayUtils {
} }
return new ReadonlyArrayListWrapper<T>(array, fromIndex, toIndex); return new ReadonlyArrayListWrapper<T>(array, fromIndex, toIndex);
} }
} }

+ 38
- 50
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/PropertiesUtils.java View File

@@ -37,9 +37,10 @@ public abstract class PropertiesUtils {
/** /**
* 创建配置对象的实例,并且从指定的属性表中初始化对应的实例字段; * 创建配置对象的实例,并且从指定的属性表中初始化对应的实例字段;
*
* @param configClass configClass * @param configClass configClass
* @param properties properties
* @param <T> T
* @param properties properties
* @param <T> T
* @return T * @return T
*/ */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@@ -56,13 +57,10 @@ public abstract class PropertiesUtils {
/** /**
* 创建配置对象的实例,并且从指定的属性表中初始化对应的实例字段; * 创建配置对象的实例,并且从指定的属性表中初始化对应的实例字段;
* *
* @param configClass
* 配置对象的类型;
* @param properties
* 属性表;
* @param propsPrefix
* 在属性表中与配置对象相关的属性的key的前缀;
* @param <T> T
* @param configClass 配置对象的类型;
* @param properties 属性表;
* @param propsPrefix 在属性表中与配置对象相关的属性的key的前缀;
* @param <T> T
* @return T * @return T
*/ */
public static <T> T createInstance(Class<T> configClass, Properties properties, String propsPrefix) { public static <T> T createInstance(Class<T> configClass, Properties properties, String propsPrefix) {
@@ -77,12 +75,9 @@ public abstract class PropertiesUtils {
/** /**
* 设置配置值; * 设置配置值;
* *
* @param obj
* 配置对象;配置值将设置到此对象匹配的属性;
* @param configValues
* 配置值;
* @param propPrefix
* 自动加入的属性前缀;
* @param obj 配置对象;配置值将设置到此对象匹配的属性;
* @param configValues 配置值;
* @param propPrefix 自动加入的属性前缀;
*/ */
public static void setValues(Object obj, Properties configValues, String propPrefix) { public static void setValues(Object obj, Properties configValues, String propPrefix) {
Properties values = new Properties(); Properties values = new Properties();
@@ -93,10 +88,8 @@ public abstract class PropertiesUtils {
/** /**
* 设置配置值; * 设置配置值;
* *
* @param obj
* 配置对象;配置值将设置到此对象匹配的属性;
* @param configValues
* 配置值;
* @param obj 配置对象;配置值将设置到此对象匹配的属性;
* @param configValues 配置值;
*/ */
public static void setValues(Object obj, Properties configValues) { public static void setValues(Object obj, Properties configValues) {
BeanWrapper confBean = new BeanWrapperImpl(obj); BeanWrapper confBean = new BeanWrapperImpl(obj);
@@ -109,13 +102,10 @@ public abstract class PropertiesUtils {
/** /**
* 从指定的路径加载配置; * 从指定的路径加载配置;
* *
* @param configClass
* 配置对象的类型;
* @param configFilePathPattern
* properties配置文件的路径;可以指定 spring 资源路径表达式;
* @param charset
* 字符集;
* @param <T> class
* @param configClass 配置对象的类型;
* @param configFilePathPattern properties配置文件的路径;可以指定 spring 资源路径表达式;
* @param charset 字符集;
* @param <T> class
* @return T * @return T
* @throws IOException exception * @throws IOException exception
*/ */
@@ -127,12 +117,9 @@ public abstract class PropertiesUtils {
/** /**
* 从指定的路径加载配置; * 从指定的路径加载配置;
* *
* @param obj
* 配置对象;配置文件的值将设置到此对象匹配的属性;
* @param configFilePathPattern
* properties配置文件的路径;可以指定 spring 资源路径表达式;
* @param charset
* 字符集;
* @param obj 配置对象;配置文件的值将设置到此对象匹配的属性;
* @param configFilePathPattern properties配置文件的路径;可以指定 spring 资源路径表达式;
* @param charset 字符集;
* @throws IOException exception * @throws IOException exception
*/ */
public static void load(Object obj, String configFilePathPattern, String charset) throws IOException { public static void load(Object obj, String configFilePathPattern, String charset) throws IOException {
@@ -180,10 +167,8 @@ public abstract class PropertiesUtils {
/** /**
* 合并两个 properties ; * 合并两个 properties ;
* *
* @param props
* 要将其它值合并进来的属性集合;操作将对其产生修改;
* @param from
* 属性值将要合并进入其它属性集合;操作不对其产生修改;
* @param props 要将其它值合并进来的属性集合;操作将对其产生修改;
* @param from 属性值将要合并进入其它属性集合;操作不对其产生修改;
*/ */
public static void mergeFrom(Properties props, Properties from) { public static void mergeFrom(Properties props, Properties from) {
mergeFrom(props, from, null); mergeFrom(props, from, null);
@@ -192,12 +177,9 @@ public abstract class PropertiesUtils {
/** /**
* 合并两个 properties ; * 合并两个 properties ;
* *
* @param props
* 要将其它值合并进来的属性集合;操作将对其产生修改;
* @param from
* 属性值将要合并进入其它属性集合;操作不对其产生修改;
* @param propertyNamePrefix
* 属性名称前缀;
* @param props 要将其它值合并进来的属性集合;操作将对其产生修改;
* @param from 属性值将要合并进入其它属性集合;操作不对其产生修改;
* @param propertyNamePrefix 属性名称前缀;
*/ */
public static void mergeFrom(Properties props, Properties from, String propertyNamePrefix) { public static void mergeFrom(Properties props, Properties from, String propertyNamePrefix) {
if (propertyNamePrefix == null || propertyNamePrefix.length() == 0) { if (propertyNamePrefix == null || propertyNamePrefix.length() == 0) {
@@ -214,12 +196,9 @@ public abstract class PropertiesUtils {
/** /**
* 获取指定 properties 中以指定的前缀开头的子集; * 获取指定 properties 中以指定的前缀开头的子集;
* *
* @param props
* 要抽取的属性集合;
* @param propertyNamePrefix
* 属性名称前缀;
* @param trimPrefix
* 是否在复制的新的属性集合去掉指定的前缀;
* @param props 要抽取的属性集合;
* @param propertyNamePrefix 属性名称前缀;
* @param trimPrefix 是否在复制的新的属性集合去掉指定的前缀;
* @return properties * @return properties
*/ */
public static Properties subset(Properties props, String propertyNamePrefix, boolean trimPrefix) { public static Properties subset(Properties props, String propertyNamePrefix, boolean trimPrefix) {
@@ -278,13 +257,22 @@ public abstract class PropertiesUtils {
* 如果不存在,或者返回值为空(null 或 空白字符),则抛出 {@link IllegalArgumentException} 异常; * 如果不存在,或者返回值为空(null 或 空白字符),则抛出 {@link IllegalArgumentException} 异常;
* *
* @param props props * @param props props
* @param key key
* @param key key
* @return String * @return String
*/ */
public static String getRequiredProperty(Properties props, String key) { public static String getRequiredProperty(Properties props, String key) {
return getProperty(props, key, true); return getProperty(props, key, true);
} }
/**
* 返回指定的属性; <br>
*
* @param props 属性表;
* @param key 要查找的 key;
* @param required 值为 false 时,如果不存在则返回 null;值为 true 时,如果不存在,或者返回值为空(null 或
* 空白字符),则抛出 {@link IllegalArgumentException} 异常;
* @return
*/
public static String getProperty(Properties props, String key, boolean required) { public static String getProperty(Properties props, String key, boolean required) {
String value = props.getProperty(key); String value = props.getProperty(key);
if (value == null) { if (value == null) {
@@ -319,7 +307,7 @@ public abstract class PropertiesUtils {
setValues(props, propValues); setValues(props, propValues);
return props; return props;
} }
public static Properties setValues(Properties props, Property[] propValues) { public static Properties setValues(Properties props, Property[] propValues) {
for (Property p : propValues) { for (Property p : propValues) {
props.setProperty(p.getName(), p.getValue()); props.setProperty(p.getName(), p.getValue());


+ 24
- 0
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/StringUtils.java View File

@@ -0,0 +1,24 @@
package com.jd.blockchain.utils;

import java.util.regex.Pattern;

/**
* @Author zhaogw
* date 2018/11/26 20:46
*/
public class StringUtils {
public static boolean isEmpty(Object str) {
return str == null || "".equals(str);
}

/*
* 判断是否为整数
* @param str 传入的字符串
* @return 是整数返回true,否则返回false
*/

public static boolean isNumber(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
}

+ 5
- 5
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/concurrent/InvocationResult.java View File

@@ -2,16 +2,16 @@ package com.jd.blockchain.utils.concurrent;


public class InvocationResult<T> { public class InvocationResult<T> {


private volatile T result;
private volatile T value;
private volatile Exception error; private volatile Exception error;


public T getResult() {
return result;
public T getValue() {
return value;
} }


public void setResult(T result) {
this.result = result;
public void setValue(T value) {
this.value = value;
} }


public Exception getError() { public Exception getError() {


+ 50
- 32
source/utils/utils-common/src/main/java/com/jd/blockchain/utils/io/FileUtils.java View File

@@ -1,9 +1,23 @@
package com.jd.blockchain.utils.io; package com.jd.blockchain.utils.io;


import java.io.*;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Properties; import java.util.Properties;


import org.springframework.util.ResourceUtils;

/** /**
* @author haiq * @author haiq
* *
@@ -41,7 +55,7 @@ public class FileUtils {
throw new IllegalStateException(e.getMessage(), e); throw new IllegalStateException(e.getMessage(), e);
} }
} }
/** /**
* 返回父目录的路径; * 返回父目录的路径;
* *
@@ -67,9 +81,8 @@ public class FileUtils {
/** /**
* 读取指定文件的首行; * 读取指定文件的首行;
* *
* @param file file
* @param charset
* 字符集;
* @param file file
* @param charset 字符集;
* @return 返回首行非空行;返回结果不会自动截取两头的空字符串; * @return 返回首行非空行;返回结果不会自动截取两头的空字符串;
* @throws IOException exception * @throws IOException exception
*/ */
@@ -90,9 +103,8 @@ public class FileUtils {
/** /**
* 返回指定文件的所有行; * 返回指定文件的所有行;
* *
* @param file file
* @param charset
* 字符集;
* @param file file
* @param charset 字符集;
* @return 返回首行非空行;返回结果不会自动截取两头的空字符串; * @return 返回首行非空行;返回结果不会自动截取两头的空字符串;
*/ */
public static String[] readLines(File file, String charset) { public static String[] readLines(File file, String charset) {
@@ -155,10 +167,8 @@ public class FileUtils {
/** /**
* 以默认字符集(UTF-8)将指定的文本保存到指定的文件中; * 以默认字符集(UTF-8)将指定的文本保存到指定的文件中;
* *
* @param file
* 要保存的文件;
* @param text
* 文本内容;
* @param file 要保存的文件;
* @param text 文本内容;
*/ */
public static void writeText(String text, File file) { public static void writeText(String text, File file) {
writeText(text, file, DEFAULT_CHARSET); writeText(text, file, DEFAULT_CHARSET);
@@ -166,12 +176,10 @@ public class FileUtils {


/** /**
* 将指定的文本保存到指定的文件中; * 将指定的文本保存到指定的文件中;
* @param text
* 文本内容;
* @param file
* 要保存的文件;
* @param charset
* 字符集;
*
* @param text 文本内容;
* @param file 要保存的文件;
* @param charset 字符集;
*/ */
public static void writeText(String text, File file, String charset) { public static void writeText(String text, File file, String charset) {
try (FileOutputStream out = new FileOutputStream(file, false)) { try (FileOutputStream out = new FileOutputStream(file, false)) {
@@ -181,7 +189,7 @@ public class FileUtils {
throw new RuntimeIOException(e.getMessage(), e); throw new RuntimeIOException(e.getMessage(), e);
} }
} }
public static void writeBytes(byte[] content, File file) { public static void writeBytes(byte[] content, File file) {
try (FileOutputStream out = new FileOutputStream(file, false)) { try (FileOutputStream out = new FileOutputStream(file, false)) {
out.write(content); out.write(content);
@@ -190,7 +198,7 @@ public class FileUtils {
throw new RuntimeIOException(e.getMessage(), e); throw new RuntimeIOException(e.getMessage(), e);
} }
} }
public static void appendBytes(byte[] content, File file) { public static void appendBytes(byte[] content, File file) {
try (FileOutputStream out = new FileOutputStream(file, true)) { try (FileOutputStream out = new FileOutputStream(file, true)) {
out.write(content); out.write(content);
@@ -224,16 +232,23 @@ public class FileUtils {


/** /**
* 以默认字符集(UTF-8)从文件读取文本; * 以默认字符集(UTF-8)从文件读取文本;
*
* @param file file * @param file file
* @return String * @return String
*/ */
public static String readText(String file) {
return readText(new File(file), DEFAULT_CHARSET);
public static String readText(String filePath) {
try {
File file = ResourceUtils.getFile(filePath);
return readText(file, DEFAULT_CHARSET);
} catch (FileNotFoundException e) {
throw new RuntimeIOException(e.getMessage(), e);
}
} }


/** /**
* 从文件读取文本; * 从文件读取文本;
* @param file file
*
* @param file file
* @param charset charset * @param charset charset
* @return String * @return String
*/ */
@@ -254,7 +269,7 @@ public class FileUtils {
/** /**
* 从文件读取文本; * 从文件读取文本;
* *
* @param file file
* @param file file
* @param charset charset * @param charset charset
* @return String * @return String
*/ */
@@ -278,7 +293,7 @@ public class FileUtils {
/** /**
* 从流读取文本; * 从流读取文本;
* *
* @param in in
* @param in in
* @param charset charset * @param charset charset
* @return String * @return String
* @throws IOException exception * @throws IOException exception
@@ -310,7 +325,7 @@ public class FileUtils {
throw new RuntimeIOException(e.getMessage(), e); throw new RuntimeIOException(e.getMessage(), e);
} }
} }
public static byte[] readBytes(File file) { public static byte[] readBytes(File file) {
try { try {
FileInputStream in = new FileInputStream(file); FileInputStream in = new FileInputStream(file);
@@ -324,8 +339,12 @@ public class FileUtils {
} }
} }


public static Properties readProperties(String systemConfig) {
return readProperties(systemConfig, DEFAULT_CHARSET);
public static Properties readProperties(String file) {
return readProperties(file, DEFAULT_CHARSET);
}

public static Properties readProperties(File file) {
return readProperties(file, DEFAULT_CHARSET);
} }


public static Properties readProperties(String file, String charset) { public static Properties readProperties(String file, String charset) {
@@ -417,11 +436,11 @@ public class FileUtils {
throw new IllegalStateException(e.getMessage(), e); throw new IllegalStateException(e.getMessage(), e);
} }
} }
public static void deleteFile(String dir) { public static void deleteFile(String dir) {
deleteFile(dir, false); deleteFile(dir, false);
} }
public static void deleteFile(File file) { public static void deleteFile(File file) {
deleteFile(file, false); deleteFile(file, false);
} }
@@ -435,8 +454,7 @@ public class FileUtils {
* 删除文件; * 删除文件;
* *
* @param file * @param file
* @param silent
* 是否静默删除;如果为 true ,则吞噬删除过程中的异常,意味着方法即便正常返回时也有可能删除不完全;
* @param silent 是否静默删除;如果为 true ,则吞噬删除过程中的异常,意味着方法即便正常返回时也有可能删除不完全;
*/ */
public static void deleteFile(File file, boolean silent) { public static void deleteFile(File file, boolean silent) {
if (file.isFile()) { if (file.isFile()) {


Loading…
Cancel
Save