@@ -139,7 +139,7 @@ public final class Crypto { | |||||
public static CryptoProvider getProvider(String providerFullName) { | public static CryptoProvider getProvider(String providerFullName) { | ||||
Provider<CryptoService> pd = pm.getProvider(CryptoService.class, providerFullName); | Provider<CryptoService> pd = pm.getProvider(CryptoService.class, providerFullName); | ||||
if (pd == null) { | if (pd == null) { | ||||
return null; | |||||
throw new CryptoException("Crypto service provider named [" + providerFullName + "] does not exist!"); | |||||
} | } | ||||
return getProviderInfo(pd); | 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= | 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(BlockBody.class); | ||||
DataContractRegistry.register(CryptoProvider.class); | DataContractRegistry.register(CryptoProvider.class); | ||||
} | } | ||||
public static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(), | public static final String[] SUPPORTED_PROVIDERS = { ClassicCryptoService.class.getName(), | ||||
SMCryptoService.class.getName() }; | SMCryptoService.class.getName() }; | ||||
@@ -185,9 +184,9 @@ public class LedgerManagerTest { | |||||
} | } | ||||
CryptoConfig defCryptoSetting = new CryptoConfig(); | CryptoConfig defCryptoSetting = new CryptoConfig(); | ||||
defCryptoSetting.setSupportedProviders(supportedProviders); | defCryptoSetting.setSupportedProviders(supportedProviders); | ||||
defCryptoSetting.setAutoVerifyHash(true); | defCryptoSetting.setAutoVerifyHash(true); | ||||
defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256); | defCryptoSetting.setHashAlgorithm(ClassicAlgorithm.SHA256); | ||||
@@ -16,38 +16,42 @@ 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()); | |||||
LedgerInitProperties initProps = LedgerInitProperties.resolve(in); | |||||
assertEquals(4, initProps.getConsensusParticipantCount()); | |||||
String expectedLedgerSeed = "932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe" | String expectedLedgerSeed = "932dfe23-fe23232f-283f32fa-dd32aa76-8322ca2f-56236cda-7136b322-cb323ffe" | ||||
.replace("-", ""); | .replace("-", ""); | ||||
String actualLedgerSeed = HexUtils.encode(setting.getLedgerSeed()); | |||||
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); | |||||
ConsensusParticipantConfig part2 = initProps.getConsensusParticipant(2); | |||||
assertEquals("7VeRAr3dSbi1xatq11ZcF7sEPkaMmtZhV9shonGJWk9T4pLe", part2.getPubKey().toBase58()); | assertEquals("7VeRAr3dSbi1xatq11ZcF7sEPkaMmtZhV9shonGJWk9T4pLe", part2.getPubKey().toBase58()); | ||||
} finally { | } finally { |
@@ -12,6 +12,11 @@ consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensu | |||||
#共识服务的参数配置;必须; | #共识服务的参数配置;必须; | ||||
consensus.conf=classpath:bftsmart.config | 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,6 +11,10 @@ consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensu | |||||
#共识服务的参数配置;必须; | #共识服务的参数配置;必须; | ||||
consensus.conf=classpath:bftsmart.config | 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,6 +11,11 @@ consensus.service-provider=com.jd.blockchain.consensus.bftsmart.BftsmartConsensu | |||||
#共识服务的参数配置;必须; | #共识服务的参数配置;必须; | ||||
consensus.conf=classpath:bftsmart.config | 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 | ||||
@@ -45,9 +45,11 @@ public class LedgerInitProperties { | |||||
// 共识服务提供者;必须; | // 共识服务提供者;必须; | ||||
public static final String CONSENSUS_SERVICE_PROVIDER = "consensus.service-provider"; | 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; | private byte[] ledgerSeed; | ||||
@@ -57,8 +59,10 @@ public class LedgerInitProperties { | |||||
private Properties consensusConfig; | private Properties consensusConfig; | ||||
private String[] cryptoProviders; | |||||
public byte[] getLedgerSeed() { | public byte[] getLedgerSeed() { | ||||
return ledgerSeed; | |||||
return ledgerSeed.clone(); | |||||
} | } | ||||
public Properties getConsensusConfig() { | public Properties getConsensusConfig() { | ||||
@@ -76,6 +80,14 @@ public class LedgerInitProperties { | |||||
public List<ConsensusParticipantConfig> getConsensusParticipants() { | public List<ConsensusParticipantConfig> getConsensusParticipants() { | ||||
return consensusParticipants; | 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.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)); | int partCount = getInt(PropertiesUtils.getRequiredProperty(props, PART_COUNT)); | ||||
if (partCount < 0) { | if (partCount < 0) { | ||||
@@ -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 | |||||