@@ -139,7 +139,7 @@ public final class Crypto { | |||
public static CryptoProvider getProvider(String providerFullName) { | |||
Provider<CryptoService> pd = pm.getProvider(CryptoService.class, providerFullName); | |||
if (pd == null) { | |||
return null; | |||
throw new CryptoException("Crypto service provider named [" + providerFullName + "] does not exist!"); | |||
} | |||
return getProviderInfo(pd); | |||
} | |||
@@ -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 | |||
@@ -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 |
@@ -22,11 +22,3 @@ ledger.db.uri= | |||
#账本数据库的连接口令 | |||
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 |
@@ -59,7 +59,6 @@ public class LedgerManagerTest { | |||
DataContractRegistry.register(BlockBody.class); | |||
DataContractRegistry.register(CryptoProvider.class); | |||
} | |||
public static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(), | |||
SMCryptoService.class.getName() }; | |||
@@ -185,9 +184,9 @@ public class LedgerManagerTest { | |||
} | |||
CryptoConfig defCryptoSetting = new CryptoConfig(); | |||
defCryptoSetting.setSupportedProviders(supportedProviders); | |||
defCryptoSetting.setAutoVerifyHash(true); | |||
defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256); | |||
@@ -16,38 +16,42 @@ import com.jd.blockchain.tools.keygen.KeyGenCommand; | |||
import com.jd.blockchain.utils.codec.HexUtils; | |||
import test.com.jd.blockchain.intgr.IntegrationBase; | |||
public class LedgerInitSettingTest { | |||
public class LedgerInitPropertiesTest { | |||
@Test | |||
public void test() throws IOException { | |||
ClassPathResource ledgerInitSettingResource = new ClassPathResource("ledger.init"); | |||
InputStream in = ledgerInitSettingResource.getInputStream(); | |||
try { | |||
LedgerInitProperties setting = LedgerInitProperties.resolve(in); | |||
assertEquals(4, setting.getConsensusParticipantCount()); | |||
LedgerInitProperties initProps = LedgerInitProperties.resolve(in); | |||
assertEquals(4, initProps.getConsensusParticipantCount()); | |||
String expectedLedgerSeed = "932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe" | |||
.replace("-", ""); | |||
String actualLedgerSeed = HexUtils.encode(setting.getLedgerSeed()); | |||
String actualLedgerSeed = HexUtils.encode(initProps.getLedgerSeed()); | |||
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("keys/jd-com.pub", part0.getPubKeyPath()); | |||
PubKey pubKey0 = KeyGenCommand.decodePubKey("3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9"); | |||
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(8800, part0.getInitializerAddress().getPort()); | |||
assertEquals(true, part0.getInitializerAddress().isSecure()); | |||
ConsensusParticipantConfig part1 = setting.getConsensusParticipant(1); | |||
ConsensusParticipantConfig part1 = initProps.getConsensusParticipant(1); | |||
assertEquals(false, part1.getInitializerAddress().isSecure()); | |||
PubKey pubKey1 = KeyGenCommand.decodePubKey("3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX"); | |||
assertEquals(pubKey1, part1.getPubKey()); | |||
ConsensusParticipantConfig part2 = setting.getConsensusParticipant(2); | |||
ConsensusParticipantConfig part2 = initProps.getConsensusParticipant(2); | |||
assertEquals("7VeRAr3dSbi1xatq11ZcF7sEPkaMmtZhV9shonGJWk9T4pLe", part2.getPubKey().toBase58()); | |||
} finally { |
@@ -12,6 +12,11 @@ consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensu | |||
#共识服务的参数配置;必须; | |||
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 | |||
@@ -11,6 +11,10 @@ consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensu | |||
#共识服务的参数配置;必须; | |||
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 | |||
@@ -11,6 +11,11 @@ consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensu | |||
#共识服务的参数配置;必须; | |||
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 | |||
@@ -45,9 +45,11 @@ public class LedgerInitProperties { | |||
// 共识服务提供者;必须; | |||
public static final String CONSENSUS_SERVICE_PROVIDER = "consensus.service-provider"; | |||
// 密码服务提供者列表,以英文逗点“,”分隔;必须; | |||
public static final String CRYPTO_SERVICE_PROVIDER = "crypto.service-providers"; | |||
public static final String CRYPTO_SERVICE_PROVIDERS = "crypto.service-providers"; | |||
public static final String CRYPTO_SERVICE_PROVIDERS_SPLITTER = ","; | |||
private byte[] ledgerSeed; | |||
@@ -57,8 +59,10 @@ public class LedgerInitProperties { | |||
private Properties consensusConfig; | |||
private String[] cryptoProviders; | |||
public byte[] getLedgerSeed() { | |||
return ledgerSeed; | |||
return ledgerSeed.clone(); | |||
} | |||
public Properties getConsensusConfig() { | |||
@@ -76,6 +80,14 @@ public class LedgerInitProperties { | |||
public List<ConsensusParticipantConfig> getConsensusParticipants() { | |||
return consensusParticipants; | |||
} | |||
public String[] getCryptoProviders() { | |||
return cryptoProviders.clone(); | |||
} | |||
public void setCryptoProviders(String[] cryptoProviders) { | |||
this.cryptoProviders = cryptoProviders; | |||
} | |||
/** | |||
* 返回参与者; | |||
@@ -131,6 +143,14 @@ public class LedgerInitProperties { | |||
String.format("Consensus config file[%s] doesn't exist! ", consensusConfigFilePath), e); | |||
} | |||
// 解析密码提供者列表; | |||
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) { | |||
@@ -16,10 +16,3 @@ ledger.db.uri=redis://127.0.0.1/0 | |||
#账本数据库的连接口令; | |||
ledger.db.pwd= | |||
#共识协议的参数配置;必须参数; | |||
consensus.conf=mq.config | |||
#共识协议的实现类型;必须参数; | |||
consensus.service-provider=com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider | |||