| @@ -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 | |||