From cd63d7612b824745f19f29041e685285ba427abb Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Mon, 26 Aug 2019 19:43:31 +0800 Subject: [PATCH 01/15] add regist participant code for feature --- .../com/jd/blockchain/consts/DataCodes.java | 10 +- .../BftsmartConsensusSettingsBuilder.java | 81 ++++++++++++++ .../consensus/ConsensusSettingsBuilder.java | 4 + .../mq/MsgQueueConsensusSettingsBuilder.java | 47 ++++++++ .../jd/blockchain/ContractDeployExeUtil.java | 20 +--- source/ledger/ledger-core/pom.xml | 5 + .../blockchain/ledger/core/LedgerSetting.java | 24 ---- .../ledger/core/ParticipantCertData.java | 13 +++ .../DefaultOperationHandleRegisteration.java | 7 +- .../ParticipantRegisterOperationHandle.java | 105 ++++++++++++++++++ .../ledger/ContractInvokingTest.java | 1 + .../blockchain/ledger/LedgerManagerTest.java | 15 +-- .../blockchain/ledger/TransactionSetTest.java | 18 +-- .../jd/blockchain/ledger/ParticipantInfo.java | 87 +++++++++------ .../ledger/ParticipantInfoData.java | 65 +++++++++++ .../jd/blockchain/ledger/ParticipantNode.java | 8 ++ .../ledger/ParticipantNodeState.java | 43 +++++++ .../ledger/ParticipantRegisterOperation.java | 13 +++ .../BlockchainOperationFactory.java | 28 +++-- .../transaction/ClientOperator.java | 2 +- .../transaction/ConsensusParticipantData.java | 12 ++ .../transaction/ParticipantOperator.java | 11 ++ .../ParticipantRegisterOpTemplate.java | 24 ++++ .../ParticipantRegisterOperationBuilder.java | 20 ++++ ...rticipantRegisterOperationBuilderImpl.java | 11 ++ .../jd/blockchain/transaction/TxBuilder.java | 3 + .../jd/blockchain/transaction/TxTemplate.java | 6 + .../converters/BinaryMessageConverter.java | 1 + .../peer/web/ManagementController.java | 17 +-- .../sdk/converters/ClientResolveUtil.java | 12 +- .../sdk/client/GatewayServiceFactory.java | 1 + .../test/SDK_GateWay_Participant_Test_.java | 99 +++++++++++++++++ .../intgr/perf/LedgerPerformanceTest.java | 14 +-- .../com/jd/blockchain/intgr/perf/Utils.java | 18 ++- .../jd/blockchain/intgr/IntegrationBase.java | 29 +++++ .../capability/service/SettingsInit.java | 15 +-- .../initializer/LedgerInitProperties.java | 11 ++ .../blockchain/mocker/MockerNodeContext.java | 1 + 38 files changed, 729 insertions(+), 172 deletions(-) delete mode 100644 source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerSetting.java create mode 100644 source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNodeState.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantRegisterOperation.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantOperator.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOpTemplate.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilder.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilderImpl.java create mode 100644 source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Test_.java diff --git a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java index 4085f8cb..8f0d8d3d 100644 --- a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java +++ b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java @@ -49,9 +49,11 @@ public interface DataCodes { public static final int TX_OP_CONTRACT_EVENT_SEND = 0x340; - public static final int TX_RESPONSE = 0x350; + public static final int TX_OP_PARTICIPANT_REG = 0x350; - public static final int TX_OP_RESULT = 0x360; + public static final int TX_RESPONSE = 0x360; + + public static final int TX_OP_RESULT = 0x370; public static final int METADATA = 0x600; @@ -69,7 +71,7 @@ public interface DataCodes { public static final int METADATA_CONSENSUS_SETTING = 0x631; - // public static final int METADATA_PARTICIPANT_INFO = 0x640; + public static final int METADATA_PARTICIPANT_INFO = 0x640; public static final int METADATA_CRYPTO_SETTING = 0x642; @@ -100,6 +102,8 @@ public interface DataCodes { public static final int ENUM_TYPE_BYTES_VALUE_TYPE = 0xB23; + public static final int ENUM_TYPE_PARTICIPANT_NODE_STATE = 0xB24; + public static final int DIGITALSIGNATURE = 0xB30; public static final int DIGITALSIGNATURE_BODY = 0xB31; diff --git a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java index e72f866a..af57f726 100644 --- a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java +++ b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java @@ -2,11 +2,18 @@ package com.jd.blockchain.consensus.bftsmart; import java.io.IOException; import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; import java.util.Properties; +import com.jd.blockchain.consensus.ConsensusProviders; +import com.jd.blockchain.consensus.NodeSettings; +import com.jd.blockchain.ledger.ParticipantInfo; import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.tools.keygen.KeyGenCommand; +import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.PropertiesUtils; +import com.jd.blockchain.utils.Property; import com.jd.blockchain.utils.codec.Base58Utils; import com.jd.blockchain.utils.io.BytesUtils; import com.jd.blockchain.utils.net.NetworkAddress; @@ -64,6 +71,8 @@ public class BftsmartConsensusSettingsBuilder implements ConsensusSettingsBuilde */ public static final String CONSENSUS_SECURE_PATTERN = "system.server.%s.network.secure"; + public static final String BFTSMART_PROVIDER = "com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider"; + private static Properties CONFIG_TEMPLATE; @@ -164,6 +173,30 @@ public class BftsmartConsensusSettingsBuilder implements ConsensusSettingsBuilde return config; } + @Override + public Bytes updateSettings(Bytes oldConsensusSettings, ParticipantInfo participantInfo) { + + //update consensus setting through node and system config two aspects + BftsmartConsensusSettings consensusSettings = (BftsmartConsensusSettings) ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(oldConsensusSettings.toBytes()); + + Property[] systemConfigs = systemConfigs(consensusSettings.getSystemConfigs()); + + BftsmartNodeSettings[] nodeSettings = nodeSettings(consensusSettings.getNodes(), participantInfo); + + BftsmartConsensusConfig bftsmartConsensusConfig = new BftsmartConsensusConfig(nodeSettings, systemConfigs); + + for(int i = 0 ;i < bftsmartConsensusConfig.getNodes().length; i++) { + System.out.printf("id = %d, host = %s, port = %d\r\n", bftsmartConsensusConfig.getNodes()[i].getId(), bftsmartConsensusConfig.getNodes()[i].getNetworkAddress().getHost(), bftsmartConsensusConfig.getNodes()[i].getNetworkAddress().getPort()); + } + + for(int i = 0 ;i < bftsmartConsensusConfig.getSystemConfigs().length; i++) { + System.out.printf("property name = %s, property value = %s\r\n",bftsmartConsensusConfig.getSystemConfigs()[i].getName(), bftsmartConsensusConfig.getSystemConfigs()[i].getValue()); + } + + return new Bytes(ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().encode(bftsmartConsensusConfig)); + + } + private static String keyOfNode(String pattern, int id) { return String.format(pattern, id); } @@ -224,4 +257,52 @@ public class BftsmartConsensusSettingsBuilder implements ConsensusSettingsBuilde PropertiesUtils.setValues(props, bftsmartSettings.getSystemConfigs()); } + /** + * + * update system.servers.num property + * + */ + private Property[] systemConfigs(Property[] systemConfigs) { + Map propertyMap = convert2Map(systemConfigs); + int serverNum = Integer.parseInt(propertyMap.get("system.servers.num").getValue()); + propertyMap.put("system.servers.num", new Property("system.servers.num", String.valueOf(serverNum + 1))); + return convert2Array(propertyMap); + + } + + private Map convert2Map(Property[] properties) { + Map propertyMap = new HashMap<>(); + for (Property property : properties) { + propertyMap.put(property.getName(), property); + } + return propertyMap; + } + + private Property[] convert2Array(Map map) { + Property[] properties = new Property[map.size()]; + int index = 0; + for (Map.Entry entry : map.entrySet()) { + properties[index++] = entry.getValue(); + } + return properties; + } + + /** + * + * update node setting + * + */ + private BftsmartNodeSettings[] nodeSettings(NodeSettings[] nodeSettings, ParticipantInfo participantInfo) { + + BftsmartNodeConfig bftsmartNodeConfig = new BftsmartNodeConfig(participantInfo.getPubKey(), nodeSettings.length, participantInfo.getNetworkAddress()); + + BftsmartNodeSettings[] bftsmartNodeSettings = new BftsmartNodeSettings[nodeSettings.length + 1]; + for (int i = 0; i < nodeSettings.length; i++) { + bftsmartNodeSettings[i] = (BftsmartNodeSettings)nodeSettings[i]; + } + bftsmartNodeSettings[nodeSettings.length] = bftsmartNodeConfig; + return bftsmartNodeSettings; + } + + } diff --git a/source/consensus/consensus-framework/src/main/java/com/jd/blockchain/consensus/ConsensusSettingsBuilder.java b/source/consensus/consensus-framework/src/main/java/com/jd/blockchain/consensus/ConsensusSettingsBuilder.java index c4f46776..4a58f024 100644 --- a/source/consensus/consensus-framework/src/main/java/com/jd/blockchain/consensus/ConsensusSettingsBuilder.java +++ b/source/consensus/consensus-framework/src/main/java/com/jd/blockchain/consensus/ConsensusSettingsBuilder.java @@ -1,6 +1,8 @@ package com.jd.blockchain.consensus; +import com.jd.blockchain.ledger.ParticipantInfo; import com.jd.blockchain.ledger.ParticipantNode; +import com.jd.blockchain.utils.Bytes; import java.util.Properties; @@ -16,6 +18,8 @@ public interface ConsensusSettingsBuilder { * @return */ ConsensusSettings createSettings(Properties props, ParticipantNode[] participantNodes); + + Bytes updateSettings(Bytes oldConsensusSettings, ParticipantInfo participantInfo); Properties createPropertiesTemplate(); diff --git a/source/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java b/source/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java index 85b1fbc3..9eba0389 100644 --- a/source/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java +++ b/source/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java @@ -8,6 +8,7 @@ */ package com.jd.blockchain.consensus.mq; +import com.jd.blockchain.consensus.ConsensusProviders; import com.jd.blockchain.consensus.ConsensusSettings; import com.jd.blockchain.consensus.ConsensusSettingsBuilder; import com.jd.blockchain.consensus.NodeSettings; @@ -21,11 +22,13 @@ import com.jd.blockchain.consensus.mq.settings.MsgQueueNetworkSettings; import com.jd.blockchain.consensus.mq.settings.MsgQueueNodeSettings; import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.ledger.ParticipantInfo; import com.jd.blockchain.ledger.ParticipantNode; import com.jd.blockchain.tools.keygen.KeyGenCommand; import com.jd.blockchain.utils.Bytes; import com.jd.blockchain.utils.PropertiesUtils; import com.jd.blockchain.utils.codec.Base58Utils; +import com.jd.blockchain.utils.io.BytesEncoder; import com.jd.blockchain.utils.io.BytesUtils; import com.jd.blockchain.utils.io.FileUtils; import com.jd.blockchain.utils.net.NetworkAddress; @@ -82,6 +85,8 @@ public class MsgQueueConsensusSettingsBuilder implements ConsensusSettingsBuilde public static final String MSG_QUEUE_BLOCK_MAXDELAY = "system.msg.queue.block.maxdelay"; + public static final String MSG_QUEUE_PROVIDER = "com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider"; + private static Properties CONFIG_TEMPLATE; static { @@ -145,6 +150,48 @@ public class MsgQueueConsensusSettingsBuilder implements ConsensusSettingsBuilde return consensusConfig; } + private MsgQueueNodeSettings[] nodeSettings(NodeSettings[] nodeSettings, ParticipantInfo participantInfo) { + + MsgQueueNodeSettings msgQueueNodeSettings = new MsgQueueNodeConfig(); + ((MsgQueueNodeConfig) msgQueueNodeSettings).setAddress(AddressEncoding.generateAddress(participantInfo.getPubKey()).toBase58()); + ((MsgQueueNodeConfig) msgQueueNodeSettings).setPubKey(participantInfo.getPubKey()); + + MsgQueueNodeSettings[] msgQueuetNodeSettings = new MsgQueueNodeSettings[nodeSettings.length + 1]; + for (int i = 0; i < nodeSettings.length; i++) { + msgQueuetNodeSettings[i] = (MsgQueueNodeSettings)nodeSettings[i]; + } + msgQueuetNodeSettings[nodeSettings.length] = msgQueueNodeSettings; + + return msgQueuetNodeSettings; + } + + @Override + public Bytes updateSettings(Bytes oldConsensusSettings, ParticipantInfo participantInfo) { + + BytesEncoder consensusEncoder = ConsensusProviders.getProvider(MSG_QUEUE_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder(); + + MsgQueueConsensusSettings consensusSettings = (MsgQueueConsensusSettings) consensusEncoder.decode(oldConsensusSettings.toBytes()); + + MsgQueueNodeSettings[] nodeSettings = nodeSettings(consensusSettings.getNodes(), participantInfo); + + MsgQueueConsensusConfig msgQueueConsensusConfig = new MsgQueueConsensusConfig(); + for (int i = 0; i < nodeSettings.length; i++) { + msgQueueConsensusConfig.addNodeSettings(nodeSettings[i]); + } + + msgQueueConsensusConfig.setBlockSettings(consensusSettings.getBlockSettings()); + + msgQueueConsensusConfig.setNetworkSettings(consensusSettings.getNetworkSettings()); + + + for(int i = 0 ;i < msgQueueConsensusConfig.getNodes().length; i++) { + System.out.printf("node addr = %s\r\n", msgQueueConsensusConfig.getNodes()[i].getAddress()); + } + + return new Bytes(consensusEncoder.encode(msgQueueConsensusConfig)); + + } + @Override public Properties createPropertiesTemplate() { return PropertiesUtils.cloneFrom(CONFIG_TEMPLATE); diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java index a206a854..24a25a90 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java @@ -9,24 +9,7 @@ import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.PrivKey; import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.BlockchainIdentity; -import com.jd.blockchain.ledger.BlockchainIdentityData; -import com.jd.blockchain.ledger.BlockchainKeyGenerator; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.ledger.ContractCodeDeployOperation; -import com.jd.blockchain.ledger.ContractEventSendOperation; -import com.jd.blockchain.ledger.DataAccountKVSetOperation; -import com.jd.blockchain.ledger.DataAccountRegisterOperation; -import com.jd.blockchain.ledger.EndpointRequest; -import com.jd.blockchain.ledger.NodeRequest; -import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.PreparedTransaction; -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.TransactionTemplate; -import com.jd.blockchain.ledger.UserRegisterOperation; +import com.jd.blockchain.ledger.*; import com.jd.blockchain.sdk.BlockchainService; import com.jd.blockchain.sdk.client.GatewayServiceFactory; import com.jd.blockchain.tools.keygen.KeyGenCommand; @@ -111,6 +94,7 @@ public enum ContractDeployExeUtil { DataContractRegistry.register(ContractEventSendOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); } public BlockchainService initBcsrv(String host, int port) { diff --git a/source/ledger/ledger-core/pom.xml b/source/ledger/ledger-core/pom.xml index 3938916c..e7bfe29e 100644 --- a/source/ledger/ledger-core/pom.xml +++ b/source/ledger/ledger-core/pom.xml @@ -40,6 +40,11 @@ contract-framework ${project.version} + + com.jd.blockchain + consensus-framework + ${project.version} + com.jd.blockchain contract-jvm diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerSetting.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerSetting.java deleted file mode 100644 index 6e9ad134..00000000 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerSetting.java +++ /dev/null @@ -1,24 +0,0 @@ -//package com.jd.blockchain.ledger.core; -// -//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.ledger.CryptoSetting; -//import com.jd.blockchain.utils.Bytes; -// -//@DataContract(code = DataCodes.METADATA_LEDGER_SETTING) -//public interface LedgerSetting { -// -// @DataField(order=0, primitiveType=PrimitiveType.TEXT) -// String getConsensusProvider(); -// -// @DataField(order=1, primitiveType=PrimitiveType.BYTES) -// Bytes getConsensusSetting(); -// -// @DataField(order=2, refContract=true) -// CryptoSetting getCryptoSetting(); -// -//// PrivilegeModelSetting getPrivilegesModelSetting(); -// -//} \ No newline at end of file diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java index 05fd0611..b7918b51 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java @@ -2,6 +2,7 @@ package com.jd.blockchain.ledger.core; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.ParticipantNode; +import com.jd.blockchain.ledger.ParticipantNodeState; /** * 参与方证书数据对象; @@ -15,6 +16,7 @@ public class ParticipantCertData implements ParticipantNode { private String address; private String name; private PubKey pubKey; + private ParticipantNodeState participantNodeState; public ParticipantCertData() { } @@ -24,6 +26,7 @@ public class ParticipantCertData implements ParticipantNode { this.address = participantNode.getAddress(); this.name = participantNode.getName(); this.pubKey = participantNode.getPubKey(); + this.participantNodeState = participantNode.getParticipantNodeState(); } public ParticipantCertData(String address, String name, PubKey pubKey) { @@ -54,4 +57,14 @@ public class ParticipantCertData implements ParticipantNode { public void setId(int id) { this.id = id; } + + @Override + public ParticipantNodeState getParticipantNodeState() { + return participantNodeState; + } + + public void setParticipantNodeState(ParticipantNodeState participantNodeState) { + this.participantNodeState = participantNodeState; + } + } \ No newline at end of file diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java index 1966c716..d7db478d 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java @@ -3,15 +3,11 @@ package com.jd.blockchain.ledger.core.impl; import java.util.ArrayList; import java.util.List; +import com.jd.blockchain.ledger.core.impl.handles.*; import org.springframework.stereotype.Component; import com.jd.blockchain.ledger.LedgerException; import com.jd.blockchain.ledger.core.OperationHandle; -import com.jd.blockchain.ledger.core.impl.handles.ContractCodeDeployOperationHandle; -import com.jd.blockchain.ledger.core.impl.handles.JVMContractEventSendOperationHandle; -import com.jd.blockchain.ledger.core.impl.handles.DataAccountKVSetOperationHandle; -import com.jd.blockchain.ledger.core.impl.handles.DataAccountRegisterOperationHandle; -import com.jd.blockchain.ledger.core.impl.handles.UserRegisterOperationHandle; @Component public class DefaultOperationHandleRegisteration implements OperationHandleRegisteration { @@ -29,6 +25,7 @@ public class DefaultOperationHandleRegisteration implements OperationHandleRegis opHandles.add(new DataAccountKVSetOperationHandle()); opHandles.add(new DataAccountRegisterOperationHandle()); opHandles.add(new UserRegisterOperationHandle()); + opHandles.add(new ParticipantRegisterOperationHandle()); opHandles.add(new ContractCodeDeployOperationHandle()); opHandles.add(new JVMContractEventSendOperationHandle()); } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java new file mode 100644 index 00000000..e06d813c --- /dev/null +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java @@ -0,0 +1,105 @@ +package com.jd.blockchain.ledger.core.impl.handles; + +import com.jd.blockchain.consensus.ConsensusProvider; +import com.jd.blockchain.consensus.ConsensusProviders; +import com.jd.blockchain.crypto.AddressEncoding; +import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.ledger.core.*; +import com.jd.blockchain.ledger.core.impl.OperationHandleContext; +import com.jd.blockchain.utils.Bytes; + +public class ParticipantRegisterOperationHandle implements OperationHandle { + @Override + public BytesValue process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, + LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { + + ParticipantRegisterOperation participantRegOp = (ParticipantRegisterOperation) op; + + System.out.println("ParticipantRegisterOperationHandle start\r\n"); + + LedgerAdminAccount adminAccount = dataset.getAdminAccount(); + + ParticipantInfo participantInfo = participantRegOp.getParticipantInfo(); + + ConsensusProvider provider = ConsensusProviders.getProvider(adminAccount.getSetting().getConsensusProvider()); + + ParticipantNode participantNode = new PartNode((int)(adminAccount.getParticipantCount()), participantInfo.getName(), participantInfo.getPubKey(), ParticipantNodeState.REGISTED); + + LedgerAdminAccount.LedgerMetadataImpl metadata = (LedgerAdminAccount.LedgerMetadataImpl) adminAccount.getMetadata(); + + + PubKey pubKey = participantNode.getPubKey(); + + BlockchainIdentityData identityData = new BlockchainIdentityData(pubKey); + + //update consensus setting + Bytes newConsensusSettings = provider.getSettingsFactory().getConsensusSettingsBuilder().updateSettings(metadata.getSetting().getConsensusSetting(), participantInfo); + + LedgerSetting ledgerSetting = new LedgerConfiguration(adminAccount.getSetting().getConsensusProvider(), + newConsensusSettings, metadata.getSetting().getCryptoSetting()); + + metadata.setSetting(ledgerSetting); +// metadata.setViewId(metadata.getViewId() + 1); + + //reg participant as user + dataset.getUserAccountSet().register(identityData.getAddress(), pubKey); + + //add new participant as consensus node + adminAccount.addParticipant(participantNode); + + return null; + } + + @Override + public boolean support(Class operationType) { + return ParticipantRegisterOperation.class.isAssignableFrom(operationType); + } + + private static class PartNode implements ParticipantNode { + + private int id; + + private String address; + + private String name; + + private PubKey pubKey; + + private ParticipantNodeState participantNodeState; + + public PartNode(int id, String name, PubKey pubKey, ParticipantNodeState participantNodeState) { + this.id = id; + this.name = name; + this.pubKey = pubKey; + this.address = AddressEncoding.generateAddress(pubKey).toBase58(); + this.participantNodeState = participantNodeState; + } + + @Override + public int getId() { + return id; + } + + @Override + public String getAddress() { + return address; + } + + @Override + public String getName() { + return name; + } + + @Override + public PubKey getPubKey() { + return pubKey; + } + + @Override + public ParticipantNodeState getParticipantNodeState() { + return participantNodeState; + } + } + +} diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java index fd9df2d4..3ee6f875 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java @@ -32,6 +32,7 @@ public class ContractInvokingTest { DataContractRegistry.register(EndpointRequest.class); DataContractRegistry.register(TransactionResponse.class); DataContractRegistry.register(UserRegisterOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); } private static final String LEDGER_KEY_PREFIX = "LDG://"; diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java index dfc17f24..a38e5ca8 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertNull; import java.util.stream.Stream; +import com.jd.blockchain.ledger.*; import org.junit.Before; import org.junit.Test; @@ -19,19 +20,6 @@ import com.jd.blockchain.crypto.SignatureFunction; 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.BlockchainKeyGenerator; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.ledger.DataAccountRegisterOperation; -import com.jd.blockchain.ledger.DigitalSignature; -import com.jd.blockchain.ledger.LedgerBlock; -import com.jd.blockchain.ledger.LedgerInitSetting; -import com.jd.blockchain.ledger.LedgerTransaction; -import com.jd.blockchain.ledger.TransactionContent; -import com.jd.blockchain.ledger.TransactionRequest; -import com.jd.blockchain.ledger.TransactionRequestBuilder; -import com.jd.blockchain.ledger.TransactionState; -import com.jd.blockchain.ledger.UserRegisterOperation; import com.jd.blockchain.ledger.core.ContractAccountSet; import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.DataAccountSet; @@ -56,6 +44,7 @@ public class LedgerManagerTest { DataContractRegistry.register(TransactionContent.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(BlockBody.class); DataContractRegistry.register(CryptoProvider.class); } diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/TransactionSetTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/TransactionSetTest.java index f023a987..ebfdc55a 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/TransactionSetTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/TransactionSetTest.java @@ -9,28 +9,13 @@ import static org.junit.Assert.assertTrue; import java.util.Random; +import com.jd.blockchain.ledger.*; import org.junit.Test; import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.BlockchainKeyGenerator; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.ledger.BytesDataList; -import com.jd.blockchain.ledger.BytesValueList; -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.DataAccountKVSetOperation.KVWriteEntry; -import com.jd.blockchain.ledger.DataAccountRegisterOperation; -import com.jd.blockchain.ledger.DigitalSignature; -import com.jd.blockchain.ledger.LedgerTransaction; -import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.TransactionRequest; -import com.jd.blockchain.ledger.TransactionRequestBuilder; -import com.jd.blockchain.ledger.TransactionState; -import com.jd.blockchain.ledger.UserRegisterOperation; import com.jd.blockchain.ledger.core.TransactionSet; import com.jd.blockchain.ledger.core.impl.LedgerTransactionData; import com.jd.blockchain.ledger.core.impl.TransactionStagedSnapshot; @@ -51,6 +36,7 @@ public class TransactionSetTest { DataContractRegistry.register(DataAccountKVSetOperation.class); DataContractRegistry.register(ContractCodeDeployOperation.class); DataContractRegistry.register(ContractEventSendOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); CryptoSetting defCryptoSetting = LedgerTestUtils.createDefaultCryptoSetting(); MemoryKVStorage testStorage = new MemoryKVStorage(); diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java index 903cabfd..07f6e1d0 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java @@ -1,35 +1,52 @@ -//package com.jd.blockchain.ledger; -// -//import com.jd.blockchain.base.data.TypeCodes; -//import com.jd.blockchain.binaryproto.DataContract; -//import com.jd.blockchain.binaryproto.DataField; -//import com.jd.blockchain.crypto.asymmetric.PubKey; -// -//import my.utils.ValueType; -// -///** -// * 参与方信息; -// * -// * @author huanghaiquan -// * -// */ -//@DataContract(code = TypeCodes.METADATA_PARTICIPANT_INFO) -//public interface ParticipantInfo { -// -// /** -// * 参与者名称; -// * -// * @return -// */ -// @DataField(order = 1, primitiveType = ValueType.TEXT) -// String getName(); -// -// /** -// * 公钥; -// * -// * @return -// */ -// @DataField(order = 2, primitiveType = ValueType.BYTES) -// PubKey getPubKey(); -// -//} \ No newline at end of file +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.PubKey; +import com.jd.blockchain.utils.net.NetworkAddress; + + +/** + * 参与方信息; + * + * @author huanghaiquan + * + */ +@DataContract(code = DataCodes.METADATA_PARTICIPANT_INFO) +public interface ParticipantInfo { + + /** + * regist or unregist; + * + * @return + */ + @DataField(order = 0, primitiveType = PrimitiveType.TEXT) + String getFlag(); + + /** + * 参与者名称; + * + * @return + */ + @DataField(order = 1, primitiveType = PrimitiveType.TEXT) + String getName(); + + /** + * 公钥; + * + * @return + */ + @DataField(order = 2, primitiveType = PrimitiveType.BYTES) + PubKey getPubKey(); + + /** + * 共识协议的网络地址; + * + * @return + */ + @DataField(order = 3, primitiveType = PrimitiveType.BYTES) + NetworkAddress getNetworkAddress(); + +} \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java new file mode 100644 index 00000000..b41bb079 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java @@ -0,0 +1,65 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.utils.net.NetworkAddress; + +/** + * 即将要注册的参与方的信息 + * @author zhangshuang + * @create 2019/7/8 + * @since 1.0.0 + */ +public class ParticipantInfoData implements ParticipantInfo { + + + private String name; + + private PubKey pubKey; + + private NetworkAddress networkAddress; + + private String flag;//代表注册参与方或者删除参与方 + + public ParticipantInfoData(String flag, String name, PubKey pubKey, NetworkAddress networkAddress) { + this.flag = flag; + this.name = name; + this.pubKey = pubKey; + this.networkAddress = networkAddress; + } + + @Override + public String getFlag() { + return flag; + } + + public void setFlag(String flag) { + this.flag = flag; + } + + @Override + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public PubKey getPubKey() { + return pubKey; + } + + public void setPubKey(PubKey pubKey) { + this.pubKey = pubKey; + } + + @Override + public NetworkAddress getNetworkAddress() { + return networkAddress; + } + + public void setNetworkAddress(NetworkAddress networkAddress) { + this.networkAddress = networkAddress; + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNode.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNode.java index dd2c62fa..82730bba 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNode.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNode.java @@ -48,4 +48,12 @@ public interface ParticipantNode {// extends ConsensusNode, ParticipantInfo { */ @DataField(order = 3, primitiveType = PrimitiveType.BYTES) PubKey getPubKey(); + + /** + * 节点的状态:已注册/已参与共识 + * + * @return + */ + @DataField(order = 4, refEnum = true) + ParticipantNodeState getParticipantNodeState(); } \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNodeState.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNodeState.java new file mode 100644 index 00000000..375f196b --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantNodeState.java @@ -0,0 +1,43 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.EnumContract; +import com.jd.blockchain.binaryproto.EnumField; +import com.jd.blockchain.binaryproto.PrimitiveType; +import com.jd.blockchain.consts.DataCodes; + + +/** + * 参与方节点状态 + * @author zhangshuang + * @create 2019/7/8 + * @since 1.0.0 + */ +@EnumContract(code= DataCodes.ENUM_TYPE_PARTICIPANT_NODE_STATE) +public enum ParticipantNodeState { + + /** + * 已注册; + */ + REGISTED((byte) 0), + + /** + * 已共识; + */ + CONSENSUSED((byte) 1); + + @EnumField(type= PrimitiveType.INT8) + public final byte CODE; + + private ParticipantNodeState(byte code) { + this.CODE = code; + } + + public static ParticipantNodeState valueOf(byte code) { + for (ParticipantNodeState tr : values()) { + if (tr.CODE == code) { + return tr; + } + } + throw new IllegalArgumentException("Unsupported participant node state code!"); + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantRegisterOperation.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantRegisterOperation.java new file mode 100644 index 00000000..2762e924 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantRegisterOperation.java @@ -0,0 +1,13 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.consts.DataCodes; + +@DataContract(code= DataCodes.TX_OP_PARTICIPANT_REG) +public interface ParticipantRegisterOperation extends Operation { + + @DataField(order=1, refContract = true) + ParticipantInfo getParticipantInfo(); + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java index ef9b138a..e9d7fa77 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java @@ -4,17 +4,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import com.jd.blockchain.ledger.BlockchainIdentity; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.BytesValueList; -import com.jd.blockchain.ledger.ContractCodeDeployOperation; -import com.jd.blockchain.ledger.ContractEventSendOperation; -import com.jd.blockchain.ledger.DataAccountKVSetOperation; -import com.jd.blockchain.ledger.DataAccountRegisterOperation; -import com.jd.blockchain.ledger.LedgerInitOperation; -import com.jd.blockchain.ledger.LedgerInitSetting; -import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.UserRegisterOperation; +import com.jd.blockchain.ledger.*; import com.jd.blockchain.utils.Bytes; /** @@ -33,6 +23,8 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe // private static final ContractEventSendOperationBuilderImpl CONTRACT_EVENT_SEND_OP_BUILDER = new ContractEventSendOperationBuilderImpl(); + private static final ParticipantRegisterOperationBuilderImpl PARTICIPANT_REG_OP_BUILDER = new ParticipantRegisterOperationBuilderImpl(); + private LedgerInitOperationBuilder ledgerInitOpBuilder = new LedgerInitOperationBuilderFilter(); private UserRegisterOperationBuilder userRegOpBuilder = new UserRegisterOperationBuilderFilter(); @@ -45,6 +37,8 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe private ContractInvocationProxyBuilder contractInvoProxyBuilder = new ContractInvocationProxyBuilder(); + private ParticipantRegisterOperationBuilder participantRegOpBuilder = new ParticipantRegisterOperationBuilderFilter(); + // TODO: 暂时只支持单线程情形,未考虑多线程; private List operationList = new ArrayList<>(); @@ -82,6 +76,9 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe return contractEventSendOpBuilder; } + @Override + public ParticipantRegisterOperationBuilder participants() {return participantRegOpBuilder;} + @Override public T contract(String address, Class contractIntf) { return contractInvoProxyBuilder.create(address, contractIntf, contractEventSendOpBuilder); @@ -256,6 +253,15 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe } } + private class ParticipantRegisterOperationBuilderFilter implements ParticipantRegisterOperationBuilder { + @Override + public ParticipantRegisterOperation register(ParticipantInfo participantInfo) { + ParticipantRegisterOperation op = PARTICIPANT_REG_OP_BUILDER.register(participantInfo); + operationList.add(op); + return op; + } + } + private class ContractEventSendOperationBuilderFilter implements ContractEventSendOperationBuilder { @Override diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java index 5e47ef89..8797b4ce 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java @@ -6,6 +6,6 @@ package com.jd.blockchain.transaction; * @author huanghaiquan * */ -public interface ClientOperator extends UserOperator, DataAccountOperator, ContractOperator, EventOperator { +public interface ClientOperator extends UserOperator, DataAccountOperator, ContractOperator, EventOperator, ParticipantOperator { } \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ConsensusParticipantData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ConsensusParticipantData.java index b4e64744..99a233ba 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ConsensusParticipantData.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ConsensusParticipantData.java @@ -2,6 +2,7 @@ package com.jd.blockchain.transaction; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.ParticipantNode; +import com.jd.blockchain.ledger.ParticipantNodeState; import com.jd.blockchain.utils.net.NetworkAddress; public class ConsensusParticipantData implements ParticipantNode { @@ -16,6 +17,9 @@ public class ConsensusParticipantData implements ParticipantNode { private NetworkAddress hostAddress; + private ParticipantNodeState participantNodeState; + + public int getId() { return id; } @@ -56,4 +60,12 @@ public class ConsensusParticipantData implements ParticipantNode { this.address = address; } + public ParticipantNodeState getParticipantNodeState() { + return participantNodeState; + } + + public void setParticipantState(ParticipantNodeState participantNodeState) { + this.participantNodeState = participantNodeState; + } + } \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantOperator.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantOperator.java new file mode 100644 index 00000000..94237cc3 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantOperator.java @@ -0,0 +1,11 @@ +package com.jd.blockchain.transaction; + +public interface ParticipantOperator { + + /** + * 注册参与方操作; + * + * @return + */ + ParticipantRegisterOperationBuilder participants(); +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOpTemplate.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOpTemplate.java new file mode 100644 index 00000000..3eeaea53 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOpTemplate.java @@ -0,0 +1,24 @@ +package com.jd.blockchain.transaction; + +import com.jd.blockchain.binaryproto.DataContractRegistry; +import com.jd.blockchain.ledger.ParticipantInfo; +import com.jd.blockchain.ledger.ParticipantRegisterOperation; + +public class ParticipantRegisterOpTemplate implements ParticipantRegisterOperation { + + static { + DataContractRegistry.register(ParticipantRegisterOperation.class); + } + + private ParticipantInfo participantInfo; + + public ParticipantRegisterOpTemplate(ParticipantInfo participantInfo) { + + this.participantInfo = participantInfo; + } + + @Override + public ParticipantInfo getParticipantInfo() { + return participantInfo; + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilder.java new file mode 100644 index 00000000..3776b691 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilder.java @@ -0,0 +1,20 @@ +package com.jd.blockchain.transaction; + +import com.jd.blockchain.ledger.ParticipantInfo; +import com.jd.blockchain.ledger.ParticipantRegisterOperation; + +public interface ParticipantRegisterOperationBuilder { + + /** + * 注册; + * + * @param + * + * @param + * + * @return + */ + ParticipantRegisterOperation register(ParticipantInfo participantInfo); + + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilderImpl.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilderImpl.java new file mode 100644 index 00000000..56339bfa --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilderImpl.java @@ -0,0 +1,11 @@ +package com.jd.blockchain.transaction; + +import com.jd.blockchain.ledger.ParticipantInfo; +import com.jd.blockchain.ledger.ParticipantRegisterOperation; + +public class ParticipantRegisterOperationBuilderImpl implements ParticipantRegisterOperationBuilder { + @Override + public ParticipantRegisterOperation register(ParticipantInfo participantNode) { + return new ParticipantRegisterOpTemplate(participantNode); + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java index 1ff23a2f..9a810c56 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java @@ -110,6 +110,9 @@ public class TxBuilder implements TransactionBuilder { return opFactory.contractEvents(); } + @Override + public ParticipantRegisterOperationBuilder participants() {return opFactory.participants(); } + @Override public T contract(Bytes address, Class contractIntf) { return opFactory.contract(address, contractIntf); diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxTemplate.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxTemplate.java index 9777d238..e448db0e 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxTemplate.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxTemplate.java @@ -65,6 +65,12 @@ public class TxTemplate implements TransactionTemplate { return txBuilder.contracts(); } + @Override + public ParticipantRegisterOperationBuilder participants() { + stateManager.operate(); + return txBuilder.participants(); + } + @Override public T contract(Bytes address, Class contractIntf) { stateManager.operate(); diff --git a/source/ledger/ledger-rpc/src/main/java/com/jd/blockchain/web/converters/BinaryMessageConverter.java b/source/ledger/ledger-rpc/src/main/java/com/jd/blockchain/web/converters/BinaryMessageConverter.java index 124b85cd..b2683e2f 100644 --- a/source/ledger/ledger-rpc/src/main/java/com/jd/blockchain/web/converters/BinaryMessageConverter.java +++ b/source/ledger/ledger-rpc/src/main/java/com/jd/blockchain/web/converters/BinaryMessageConverter.java @@ -46,6 +46,7 @@ public class BinaryMessageConverter extends AbstractHttpMessageConverter DataContractRegistry.register(ContractEventSendOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(ActionRequest.class); DataContractRegistry.register(ActionResponse.class); diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java b/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java index ac95d361..ec2443a3 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.jd.blockchain.ledger.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -31,21 +32,6 @@ import com.jd.blockchain.consensus.service.NodeServer; import com.jd.blockchain.consensus.service.ServerSettings; import com.jd.blockchain.consensus.service.StateMachineReplicate; 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.LedgerManage; import com.jd.blockchain.ledger.core.LedgerRepository; @@ -116,6 +102,7 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag DataContractRegistry.register(ContractEventSendOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(ActionResponse.class); diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java index 3c251a66..7cce33c1 100644 --- a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java +++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java @@ -193,7 +193,7 @@ public class ClientResolveUtil { JSONObject pubKeyObj = currConsensusParticipant.getJSONObject("pubKey"); String pubKeyBase58 = pubKeyObj.getString("value"); // 生成ParticipantNode对象 - ParticipantCertData participantCertData = new ParticipantCertData(id, addressBase58, name, new PubKey(Bytes.fromBase58(pubKeyBase58).toBytes())); + ParticipantCertData participantCertData = new ParticipantCertData(id, addressBase58, name, new PubKey(Bytes.fromBase58(pubKeyBase58).toBytes()), ParticipantNodeState.CONSENSUSED); participantNodes[i] = participantCertData; } ledgerInitSettingData.setConsensusParticipants(participantNodes); @@ -275,6 +275,7 @@ public class ClientResolveUtil { private String address; private String name; private PubKey pubKey; + private ParticipantNodeState participantNodeState; public ParticipantCertData() { } @@ -285,11 +286,12 @@ public class ClientResolveUtil { this.pubKey = participantNode.getPubKey(); } - public ParticipantCertData(int id, String address, String name, PubKey pubKey) { + public ParticipantCertData(int id, String address, String name, PubKey pubKey, ParticipantNodeState participantNodeState) { this.id = id; this.address = address; this.name = name; this.pubKey = pubKey; + this.participantNodeState = participantNodeState; } @Override @@ -314,6 +316,12 @@ public class ClientResolveUtil { public void setId(int id) { this.id = id; } + + @Override + public ParticipantNodeState getParticipantNodeState() { + return participantNodeState; + } + } public static class KvData implements KVDataEntry { diff --git a/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java b/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java index 1fb01269..df8a4991 100644 --- a/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java +++ b/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java @@ -47,6 +47,7 @@ public class GatewayServiceFactory implements BlockchainServiceFactory, Closeabl DataContractRegistry.register(ContractEventSendOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(ActionRequest.class); DataContractRegistry.register(ActionResponse.class); diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Test_.java new file mode 100644 index 00000000..c4e0e76a --- /dev/null +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Test_.java @@ -0,0 +1,99 @@ +package test.com.jd.blockchain.sdk.test; + +import com.jd.blockchain.binaryproto.DataContractRegistry; +import com.jd.blockchain.crypto.*; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.sdk.BlockchainService; +import com.jd.blockchain.sdk.client.GatewayServiceFactory; +import com.jd.blockchain.sdk.samples.SDKDemo_Constant; +import com.jd.blockchain.tools.keygen.KeyGenCommand; +import com.jd.blockchain.utils.net.NetworkAddress; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +/** + * 注册参与方测试 + * @author zhangshuang + * @create 2019/7/4 + * @since 1.0.0 + */ + +public class SDK_GateWay_Participant_Test_ { + + private PrivKey privKey; + private PubKey pubKey; + + private BlockchainKeypair CLIENT_CERT = null; + + private String GATEWAY_IPADDR = null; + + private int GATEWAY_PORT; + + private boolean SECURE; + + private BlockchainService service; + + //根据密码工具产生的公私钥 + static String PUB = "3snPdw7i7PkdgqiGX7GbZuFSi1cwZn7vtjw4vifb1YoXgr9k6Kfmis"; + String PRIV = "177gjtZu8w1phqHFVNiFhA35cfimXmP6VuqrBFhfbXBWK8s4TRwro2tnpffwP1Emwr6SMN6"; + + @Before + public void init() { + + privKey = SDK_GateWay_KeyPair_Para.privkey1; + pubKey = SDK_GateWay_KeyPair_Para.pubKey1; + + CLIENT_CERT = new BlockchainKeypair(SDK_GateWay_KeyPair_Para.pubKey0, SDK_GateWay_KeyPair_Para.privkey0); + GATEWAY_IPADDR = "127.0.0.1"; + GATEWAY_PORT = 11000; + SECURE = false; + GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IPADDR, GATEWAY_PORT, SECURE, + CLIENT_CERT); + service = serviceFactory.getBlockchainService(); + + DataContractRegistry.register(TransactionContent.class); + DataContractRegistry.register(TransactionContentBody.class); + DataContractRegistry.register(TransactionRequest.class); + DataContractRegistry.register(NodeRequest.class); + DataContractRegistry.register(EndpointRequest.class); + DataContractRegistry.register(TransactionResponse.class); + } + + @Test + public void registerParticipant_Test() { + HashDigest[] ledgerHashs = service.getLedgerHashs(); + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHashs[0]); + + //existed signer + AsymmetricKeypair keyPair = new BlockchainKeypair(pubKey, privKey); + + PrivKey privKey = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); + + PubKey pubKey = KeyGenCommand.decodePubKey(PUB); + + System.out.println("Address = "+AddressEncoding.generateAddress(pubKey)); + + BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey); + + NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); + + ParticipantInfo participantInfo = new ParticipantInfoData("add","Peer4", user.getPubKey(), networkAddress); + + // 注册参与方 + txTemp.participants().register(participantInfo); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + // 使用私钥进行签名; + prepTx.sign(keyPair); + + // 提交交易; + TransactionResponse transactionResponse = prepTx.commit(); + assertTrue(transactionResponse.isSuccess()); + + } +} diff --git a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java index 76f3a1e7..7f6ee769 100644 --- a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java +++ b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java @@ -11,6 +11,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.DoubleStream; import com.jd.blockchain.crypto.*; +import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.CryptoConfig; import org.springframework.core.io.ClassPathResource; @@ -18,18 +19,6 @@ import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.consensus.ConsensusProvider; import com.jd.blockchain.consensus.ConsensusProviders; import com.jd.blockchain.consensus.ConsensusSettings; -import com.jd.blockchain.ledger.BlockchainIdentity; -import com.jd.blockchain.ledger.BlockchainKeyGenerator; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.ledger.BytesDataList; -import com.jd.blockchain.ledger.DataAccountKVSetOperation; -import com.jd.blockchain.ledger.DataAccountRegisterOperation; -import com.jd.blockchain.ledger.LedgerBlock; -import com.jd.blockchain.ledger.LedgerInitOperation; -import com.jd.blockchain.ledger.TransactionRequest; -import com.jd.blockchain.ledger.TransactionRequestBuilder; -import com.jd.blockchain.ledger.TransactionResponse; -import com.jd.blockchain.ledger.UserRegisterOperation; import com.jd.blockchain.ledger.core.LedgerDataSet; import com.jd.blockchain.ledger.core.LedgerEditor; import com.jd.blockchain.ledger.core.LedgerRepository; @@ -87,6 +76,7 @@ public class LedgerPerformanceTest { DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(DataAccountKVSetOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); } public static void test(String[] args) { diff --git a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java index 80b133ad..67f4781a 100644 --- a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java +++ b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java @@ -10,6 +10,7 @@ import com.jd.blockchain.crypto.*; import com.jd.blockchain.crypto.service.classic.ClassicCryptoService; import com.jd.blockchain.crypto.service.sm.SMCryptoService; import com.jd.blockchain.ledger.ParticipantNode; +import com.jd.blockchain.ledger.ParticipantNodeState; import com.jd.blockchain.tools.keygen.KeyGenCommand; import org.springframework.core.io.ClassPathResource; @@ -77,7 +78,7 @@ public class Utils { public static ParticipantNode[] loadParticipantNodes() { ParticipantNode[] participantNodes = new ParticipantNode[PUB_KEYS.length]; for (int i = 0; i < PUB_KEYS.length; i++) { - participantNodes[i] = new PartNode(i, KeyGenCommand.decodePubKey(PUB_KEYS[i])); + participantNodes[i] = new PartNode(i, KeyGenCommand.decodePubKey(PUB_KEYS[i]), ParticipantNodeState.CONSENSUSED); } return participantNodes; } @@ -235,15 +236,18 @@ public class Utils { private PubKey pubKey; - public PartNode(int id, PubKey pubKey) { - this(id, id + "", pubKey); + private ParticipantNodeState participantNodeState; + + public PartNode(int id, PubKey pubKey, ParticipantNodeState participantNodeState) { + this(id, id + "", pubKey, participantNodeState); } - public PartNode(int id, String name, PubKey pubKey) { + public PartNode(int id, String name, PubKey pubKey, ParticipantNodeState participantNodeState) { this.id = id; this.name = name; this.pubKey = pubKey; this.address = pubKey.toBase58(); + this.participantNodeState = participantNodeState; } @Override @@ -265,6 +269,12 @@ public class Utils { public PubKey getPubKey() { return pubKey; } + + @Override + public ParticipantNodeState getParticipantNodeState() { + return participantNodeState; + } + } } diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java index a13445a5..c553dcd9 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java @@ -166,6 +166,35 @@ public class IntegrationBase { return kvResponse; } + public static KeyPairResponse testSDK_RegisterParticipant(AsymmetricKeypair adminKey, HashDigest ledgerHash, + BlockchainService blockchainService) { + // 注册参与方,并验证最终写入; + BlockchainKeypair participant = BlockchainKeyGenerator.getInstance().generate(); + + // 定义交易; + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + + ParticipantInfoData participantInfoData = new ParticipantInfoData("add", "peer4", participant.getPubKey(), new NetworkAddress("127.0.0.1", 20000)); + + txTpl.participants().register(participantInfoData); + + // 签名; + PreparedTransaction ptx = txTpl.prepare(); + + HashDigest transactionHash = ptx.getHash(); + + ptx.sign(adminKey); + + // 提交并等待共识返回; + TransactionResponse txResp = ptx.commit(); + + KeyPairResponse keyPairResponse = new KeyPairResponse(); + keyPairResponse.keyPair = participant; + keyPairResponse.txResp = txResp; + keyPairResponse.txHash = transactionHash; + return keyPairResponse; + } + public static void validKeyPair(IntegrationBase.KeyPairResponse keyPairResponse, LedgerRepository ledgerRepository, KeyPairType keyPairType) { TransactionResponse txResp = keyPairResponse.txResp; diff --git a/source/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java b/source/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java index 4723d615..f6c9bced 100644 --- a/source/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java +++ b/source/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java @@ -17,19 +17,7 @@ import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.PrivKey; import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.ContractCodeDeployOperation; -import com.jd.blockchain.ledger.ContractEventSendOperation; -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.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.*; import com.jd.blockchain.tools.keygen.KeyGenCommand; import com.jd.blockchain.utils.codec.Base58Utils; @@ -58,6 +46,7 @@ public class SettingsInit { DataContractRegistry.register(ContractEventSendOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(ActionResponse.class); diff --git a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java index 7b48cec6..db75db26 100644 --- a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java +++ b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java @@ -13,6 +13,7 @@ import com.jd.blockchain.consts.Global; import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.ParticipantNode; +import com.jd.blockchain.ledger.ParticipantNodeState; import com.jd.blockchain.tools.keygen.KeyGenCommand; import com.jd.blockchain.utils.PropertiesUtils; import com.jd.blockchain.utils.codec.HexUtils; @@ -272,6 +273,8 @@ public class LedgerInitProperties { // private NetworkAddress consensusAddress; + private ParticipantNodeState participantNodeState; + private NetworkAddress initializerAddress; public int getId() { @@ -303,6 +306,14 @@ public class LedgerInitProperties { // this.pubKeyPath = pubKeyPath; // } + public ParticipantNodeState getParticipantNodeState() { + return participantNodeState; + } + + public void setParticipantNodeState(ParticipantNodeState participantNodeState) { + this.participantNodeState = participantNodeState; + } + public NetworkAddress getInitializerAddress() { return initializerAddress; } diff --git a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java index 82a79c61..56aced5d 100644 --- a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java +++ b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java @@ -86,6 +86,7 @@ public class MockerNodeContext implements BlockchainQueryService { DataContractRegistry.register(ContractEventSendOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(DataAccountKVSetOperation.class); DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class); From 712e27366262552221829d12ce50a90c114ae09f Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Tue, 27 Aug 2019 15:20:20 +0800 Subject: [PATCH 02/15] bug modify for regist participant --- .../BftsmartConsensusSettingsBuilder.java | 14 +++++++------- .../mq/MsgQueueConsensusSettingsBuilder.java | 6 +++--- .../ParticipantRegisterOperationHandle.java | 2 -- .../intgr/IntegrationTest4Bftsmart.java | 19 +++++++++++++++++++ .../blockchain/intgr/IntegrationTest4MQ.java | 18 ++++++++++++++++++ .../initializer/LedgerInitProperties.java | 2 +- 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java index af57f726..9d6637db 100644 --- a/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java +++ b/source/consensus/consensus-bftsmart/src/main/java/com/jd/blockchain/consensus/bftsmart/BftsmartConsensusSettingsBuilder.java @@ -185,13 +185,13 @@ public class BftsmartConsensusSettingsBuilder implements ConsensusSettingsBuilde BftsmartConsensusConfig bftsmartConsensusConfig = new BftsmartConsensusConfig(nodeSettings, systemConfigs); - for(int i = 0 ;i < bftsmartConsensusConfig.getNodes().length; i++) { - System.out.printf("id = %d, host = %s, port = %d\r\n", bftsmartConsensusConfig.getNodes()[i].getId(), bftsmartConsensusConfig.getNodes()[i].getNetworkAddress().getHost(), bftsmartConsensusConfig.getNodes()[i].getNetworkAddress().getPort()); - } - - for(int i = 0 ;i < bftsmartConsensusConfig.getSystemConfigs().length; i++) { - System.out.printf("property name = %s, property value = %s\r\n",bftsmartConsensusConfig.getSystemConfigs()[i].getName(), bftsmartConsensusConfig.getSystemConfigs()[i].getValue()); - } +// for(int i = 0 ;i < bftsmartConsensusConfig.getNodes().length; i++) { +// System.out.printf("id = %d, host = %s, port = %d\r\n", bftsmartConsensusConfig.getNodes()[i].getId(), bftsmartConsensusConfig.getNodes()[i].getNetworkAddress().getHost(), bftsmartConsensusConfig.getNodes()[i].getNetworkAddress().getPort()); +// } +// +// for(int i = 0 ;i < bftsmartConsensusConfig.getSystemConfigs().length; i++) { +// System.out.printf("property name = %s, property value = %s\r\n",bftsmartConsensusConfig.getSystemConfigs()[i].getName(), bftsmartConsensusConfig.getSystemConfigs()[i].getValue()); +// } return new Bytes(ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().encode(bftsmartConsensusConfig)); diff --git a/source/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java b/source/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java index 9eba0389..5790bae3 100644 --- a/source/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java +++ b/source/consensus/consensus-mq/src/main/java/com/jd/blockchain/consensus/mq/MsgQueueConsensusSettingsBuilder.java @@ -184,9 +184,9 @@ public class MsgQueueConsensusSettingsBuilder implements ConsensusSettingsBuilde msgQueueConsensusConfig.setNetworkSettings(consensusSettings.getNetworkSettings()); - for(int i = 0 ;i < msgQueueConsensusConfig.getNodes().length; i++) { - System.out.printf("node addr = %s\r\n", msgQueueConsensusConfig.getNodes()[i].getAddress()); - } +// for(int i = 0 ;i < msgQueueConsensusConfig.getNodes().length; i++) { +// System.out.printf("node addr = %s\r\n", msgQueueConsensusConfig.getNodes()[i].getAddress()); +// } return new Bytes(consensusEncoder.encode(msgQueueConsensusConfig)); diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java index e06d813c..255a8eb9 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java @@ -16,8 +16,6 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { ParticipantRegisterOperation participantRegOp = (ParticipantRegisterOperation) op; - System.out.println("ParticipantRegisterOperationHandle start\r\n"); - LedgerAdminAccount adminAccount = dataset.getAdminAccount(); ParticipantInfo participantInfo = participantRegOp.getParticipantInfo(); diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java index 9b7ae2ba..fd93a2c0 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java @@ -30,6 +30,8 @@ public class IntegrationTest4Bftsmart { private static final boolean isRegisterDataAccount = true; + private static final boolean isRegisterParticipant = true; + private static final boolean isWriteKv = true; private static final String DB_TYPE_MEM = "mem"; @@ -140,6 +142,23 @@ public class IntegrationTest4Bftsmart { } } + long participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); + + long userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); + + System.out.printf("before add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + + if (isRegisterParticipant) { + IntegrationBase.KeyPairResponse participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); + } + + participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); + + userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); + + System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + + try { System.out.println("----------------- Init Completed -----------------"); Thread.sleep(Integer.MAX_VALUE); diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java index 6e8c7f1a..f7315d17 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java @@ -30,6 +30,8 @@ public class IntegrationTest4MQ { private static final boolean isRegisterDataAccount = true; + private static final boolean isRegisterParticipant = true; + private static final boolean isWriteKv = true; private static final boolean isContract = false; @@ -138,6 +140,22 @@ public class IntegrationTest4MQ { integrationBase.testSDK_Contract(adminKey, ledgerHash, blockchainService,ledgerRepository); } + long participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); + + long userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); + + System.out.printf("before add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + + if (isRegisterParticipant) { + IntegrationBase.KeyPairResponse participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); + } + + participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); + + userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); + + System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + IntegrationBase.testConsistencyAmongNodes(ledgers); if(isOnline){ diff --git a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java index db75db26..f1d0c93b 100644 --- a/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java +++ b/source/tools/tools-initializer/src/main/java/com/jd/blockchain/tools/initializer/LedgerInitProperties.java @@ -242,7 +242,7 @@ public class LedgerInitProperties { .parseBoolean(PropertiesUtils.getRequiredProperty(props, initializerSecureKey)); NetworkAddress initializerAddress = new NetworkAddress(initializerHost, initializerPort, initializerSecure); parti.setInitializerAddress(initializerAddress); - + parti.setParticipantNodeState(ParticipantNodeState.CONSENSUSED); initProps.addConsensusParticipant(parti); } From bd59999f8322f8cf9b3269e840a8591d83403bb0 Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Tue, 27 Aug 2019 16:23:50 +0800 Subject: [PATCH 03/15] solve pubkey bug --- .../test-integration/src/test/resources/mq.config | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/source/test/test-integration/src/test/resources/mq.config b/source/test/test-integration/src/test/resources/mq.config index 33eefafe..0ff20f39 100644 --- a/source/test/test-integration/src/test/resources/mq.config +++ b/source/test/test-integration/src/test/resources/mq.config @@ -6,7 +6,12 @@ system.msg.queue.block.txsize=1000 system.msg.queue.block.maxdelay=2000 system.servers.num=4 -system.server.0.pubkey=endPsK36koyFr1D245Sa9j83vt6pZUdFBJoJRB3xAsWM6cwhRbna -system.server.1.pubkey=endPsK36sC5JdPCDPDAXUwZtS3sxEmqEhFcC4whayAsTTh8Z6eoZ -system.server.2.pubkey=endPsK36jEG281HMHeh6oSqzqLkT95DTnCM6REDURjdb2c67uR3R -system.server.3.pubkey=endPsK36nse1dck4uF19zPvAMijCV336Y3zWdgb4rQG8QoRj5ktR \ No newline at end of file +#system.server.0.pubkey=endPsK36koyFr1D245Sa9j83vt6pZUdFBJoJRB3xAsWM6cwhRbna +#system.server.1.pubkey=endPsK36sC5JdPCDPDAXUwZtS3sxEmqEhFcC4whayAsTTh8Z6eoZ +#system.server.2.pubkey=endPsK36jEG281HMHeh6oSqzqLkT95DTnCM6REDURjdb2c67uR3R +#system.server.3.pubkey=endPsK36nse1dck4uF19zPvAMijCV336Y3zWdgb4rQG8QoRj5ktR + +system.server.0.pubkey=3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9 +system.server.1.pubkey=3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX +system.server.2.pubkey=3snPdw7i7PZi6TStiyc6mzjprnNhgs2atSGNS8wPYzhbKaUWGFJt7x +system.server.3.pubkey=3snPdw7i7PifPuRX7fu3jBjsb3rJRfDe9GtbDfvFJaJ4V4hHXQfhwk From b848e92d0c4dd451f6f5931663a577b987d7aaff Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Wed, 28 Aug 2019 09:01:15 +0800 Subject: [PATCH 04/15] delete error pubkey --- source/test/test-integration/src/test/resources/mq.config | 5 ----- 1 file changed, 5 deletions(-) diff --git a/source/test/test-integration/src/test/resources/mq.config b/source/test/test-integration/src/test/resources/mq.config index 0ff20f39..9bd3238e 100644 --- a/source/test/test-integration/src/test/resources/mq.config +++ b/source/test/test-integration/src/test/resources/mq.config @@ -6,11 +6,6 @@ system.msg.queue.block.txsize=1000 system.msg.queue.block.maxdelay=2000 system.servers.num=4 -#system.server.0.pubkey=endPsK36koyFr1D245Sa9j83vt6pZUdFBJoJRB3xAsWM6cwhRbna -#system.server.1.pubkey=endPsK36sC5JdPCDPDAXUwZtS3sxEmqEhFcC4whayAsTTh8Z6eoZ -#system.server.2.pubkey=endPsK36jEG281HMHeh6oSqzqLkT95DTnCM6REDURjdb2c67uR3R -#system.server.3.pubkey=endPsK36nse1dck4uF19zPvAMijCV336Y3zWdgb4rQG8QoRj5ktR - system.server.0.pubkey=3snPdw7i7PjVKiTH2VnXZu5H8QmNaSXpnk4ei533jFpuifyjS5zzH9 system.server.1.pubkey=3snPdw7i7PajLB35tEau1kmixc6ZrjLXgxwKbkv5bHhP7nT5dhD9eX system.server.2.pubkey=3snPdw7i7PZi6TStiyc6mzjprnNhgs2atSGNS8wPYzhbKaUWGFJt7x From a572df5c98c53ecddf6618d36f2dba250bf9ebde Mon Sep 17 00:00:00 2001 From: zhaoguangwei Date: Thu, 29 Aug 2019 14:55:41 +0800 Subject: [PATCH 05/15] use the 512m --- .../deployment-peer/src/main/resources/scripts/startup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/deployment/deployment-peer/src/main/resources/scripts/startup.sh b/source/deployment/deployment-peer/src/main/resources/scripts/startup.sh index d0fdd3d5..c316ed7d 100644 --- a/source/deployment/deployment-peer/src/main/resources/scripts/startup.sh +++ b/source/deployment/deployment-peer/src/main/resources/scripts/startup.sh @@ -5,5 +5,5 @@ PEER=$(ls $HOME/system | grep deployment-peer-) if [ ! -n "$PEER" ]; then echo "Peer Is Null !!!" else - nohup java -jar -server -Xmx2g -Xms2g -Dpeer.log=$HOME $HOME/system/$PEER -home=$HOME -c $HOME/config/ledger-binding.conf -p 7080 $* >$HOME/bin/peer.out 2>&1 & + nohup java -jar -server -Xmx512m -Xms512m -Dpeer.log=$HOME $HOME/system/$PEER -home=$HOME -c $HOME/config/ledger-binding.conf -p 7080 $* >$HOME/bin/peer.out 2>&1 & fi \ No newline at end of file From 13ae4f71a8b65a88a2ca8f10ceb5de76a9be95e4 Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Thu, 29 Aug 2019 17:31:34 +0800 Subject: [PATCH 06/15] add update participant state interface --- .../com/jd/blockchain/consts/DataCodes.java | 5 +- .../ledger/core/LedgerAdminAccount.java | 9 ++ .../ledger/core/ParticipantDataSet.java | 19 ++++ .../DefaultOperationHandleRegisteration.java | 1 + ...ParticipantStateUpdateOperationHandle.java | 84 +++++++++++++++++ .../ledger/ParticipantStateUpdateInfo.java | 31 +++++++ .../ParticipantStateUpdateInfoData.java | 31 +++++++ .../ParticipantStateUpdateOperation.java | 11 +++ .../BlockchainOperationFactory.java | 16 ++++ .../transaction/ClientOperator.java | 2 +- .../transaction/ParticipantStateOperator.java | 10 ++ .../ParticipantStateUpdateOpTemplate.java | 23 +++++ ...articipantStateUpdateOperationBuilder.java | 18 ++++ ...cipantStateUpdateOperationBuilderImpl.java | 12 +++ .../jd/blockchain/transaction/TxBuilder.java | 3 + .../jd/blockchain/transaction/TxTemplate.java | 6 ++ ...SDK_GateWay_Participant_Regist_Test_.java} | 2 +- ...ateWay_Participant_State_Update_Test_.java | 91 +++++++++++++++++++ .../jd/blockchain/intgr/IntegrationBase.java | 27 ++++++ .../intgr/IntegrationTest4Bftsmart.java | 23 ++++- .../blockchain/intgr/IntegrationTest4MQ.java | 23 ++++- 21 files changed, 442 insertions(+), 5 deletions(-) create mode 100644 source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantStateUpdateOperationHandle.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfo.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfoData.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateOperation.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateOperator.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOpTemplate.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilder.java create mode 100644 source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilderImpl.java rename source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/{SDK_GateWay_Participant_Test_.java => SDK_GateWay_Participant_Regist_Test_.java} (98%) create mode 100644 source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java diff --git a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java index 8f0d8d3d..600053e8 100644 --- a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java +++ b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java @@ -50,6 +50,7 @@ public interface DataCodes { public static final int TX_OP_CONTRACT_EVENT_SEND = 0x340; public static final int TX_OP_PARTICIPANT_REG = 0x350; + public static final int TX_OP_PARTICIPANT_STATE_UPDATE = 0x351; public static final int TX_RESPONSE = 0x360; @@ -71,7 +72,9 @@ public interface DataCodes { public static final int METADATA_CONSENSUS_SETTING = 0x631; - public static final int METADATA_PARTICIPANT_INFO = 0x640; + public static final int METADATA_PARTICIPANT_INFO = 0x640; + + public static final int METADATA_PARTICIPANT_STATE_INFO = 0x641; public static final int METADATA_CRYPTO_SETTING = 0x642; diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java index c22a4ad2..87219e84 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java @@ -249,6 +249,15 @@ public class LedgerAdminAccount implements Transactional, LedgerAdministration { participants.addConsensusParticipant(participant); } + /** + * 更新参与方的状态参数; + * + * @param participant + */ + public void updateParticipant(ParticipantNode participant) { + participants.updateConsensusParticipant(participant); + } + @Override public boolean isUpdated() { return updated || participants.isUpdated(); diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantDataSet.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantDataSet.java index bd84185d..44f82e21 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantDataSet.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantDataSet.java @@ -73,6 +73,25 @@ public class ParticipantDataSet implements Transactional, MerkleProvable { } } + /** + * 更新共识参与方的状态信息;
+ * + * @param participant + */ + public void updateConsensusParticipant(ParticipantNode participant) { + Bytes key = encodeKey(participant.getAddress()); + byte[] participantBytes = BinaryProtocol.encode(participant, ParticipantNode.class); + long version = dataset.getVersion(key); + if (version < 0) { + throw new LedgerException("Participant not exist, update failed!"); + } + + long nv = dataset.setValue(key, participantBytes, version); + if (nv < 0) { + throw new LedgerException("Participant update failed!"); + } + } + private Bytes encodeKey(String address) { // return id + ""; return Bytes.fromString(address); diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java index d7db478d..fc888b29 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java @@ -28,6 +28,7 @@ public class DefaultOperationHandleRegisteration implements OperationHandleRegis opHandles.add(new ParticipantRegisterOperationHandle()); opHandles.add(new ContractCodeDeployOperationHandle()); opHandles.add(new JVMContractEventSendOperationHandle()); + opHandles.add(new ParticipantStateUpdateOperationHandle()); } /** diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantStateUpdateOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantStateUpdateOperationHandle.java new file mode 100644 index 00000000..bb0d5b65 --- /dev/null +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantStateUpdateOperationHandle.java @@ -0,0 +1,84 @@ +package com.jd.blockchain.ledger.core.impl.handles; + +import com.jd.blockchain.crypto.AddressEncoding; +import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.ledger.core.*; +import com.jd.blockchain.ledger.core.impl.OperationHandleContext; + +public class ParticipantStateUpdateOperationHandle implements OperationHandle { + + @Override + public boolean support(Class operationType) { + return ParticipantStateUpdateOperation.class.isAssignableFrom(operationType); + } + + @Override + public BytesValue process(Operation op, LedgerDataSet newBlockDataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { + + ParticipantStateUpdateOperation stateUpdateOperation = (ParticipantStateUpdateOperation) op; + + LedgerAdminAccount adminAccount = newBlockDataset.getAdminAccount(); + + ParticipantNode[] participants = adminAccount.getParticipants(); + + ParticipantNode participantNode = null; + + for(int i = 0; i < participants.length; i++) { + if (stateUpdateOperation.getStateUpdateInfo().getPubKey().equals(participants[i].getPubKey())) { + participantNode = new PartNode(participants[i].getId(), participants[i].getName(), participants[i].getPubKey(), ParticipantNodeState.CONSENSUSED); + } + } + + adminAccount.updateParticipant(participantNode); + + return null; + } + + private static class PartNode implements ParticipantNode { + + private int id; + + private String address; + + private String name; + + private PubKey pubKey; + + private ParticipantNodeState participantNodeState; + + public PartNode(int id, String name, PubKey pubKey, ParticipantNodeState participantNodeState) { + this.id = id; + this.name = name; + this.pubKey = pubKey; + this.address = AddressEncoding.generateAddress(pubKey).toBase58(); + this.participantNodeState = participantNodeState; + } + + @Override + public int getId() { + return id; + } + + @Override + public String getAddress() { + return address; + } + + @Override + public String getName() { + return name; + } + + @Override + public PubKey getPubKey() { + return pubKey; + } + + @Override + public ParticipantNodeState getParticipantNodeState() { + return participantNodeState; + } + } + +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfo.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfo.java new file mode 100644 index 00000000..8452ac92 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfo.java @@ -0,0 +1,31 @@ +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.PubKey; + +/** + * 参与方状态更新信息; + * + * + */ +@DataContract(code = DataCodes.METADATA_PARTICIPANT_STATE_INFO) +public interface ParticipantStateUpdateInfo { + /** + * 公钥; + * + * @return + */ + @DataField(order = 1, primitiveType = PrimitiveType.BYTES) + PubKey getPubKey(); + + /** + * 参与方状态; + * + * @return + */ + @DataField(order = 2, refEnum = true) + ParticipantNodeState getState(); +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfoData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfoData.java new file mode 100644 index 00000000..1f4a4fc5 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfoData.java @@ -0,0 +1,31 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.crypto.PubKey; + +public class ParticipantStateUpdateInfoData implements ParticipantStateUpdateInfo { + private PubKey pubKey; + private ParticipantNodeState state; + + public ParticipantStateUpdateInfoData(PubKey pubKey, ParticipantNodeState state) { + this.pubKey = pubKey; + this.state = state; + } + + public void setPubKey(PubKey pubKey) { + this.pubKey = pubKey; + } + + @Override + public PubKey getPubKey() { + return pubKey; + } + + public void setState(ParticipantNodeState state) { + this.state = state; + } + + @Override + public ParticipantNodeState getState() { + return state; + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateOperation.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateOperation.java new file mode 100644 index 00000000..1f656609 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateOperation.java @@ -0,0 +1,11 @@ +package com.jd.blockchain.ledger; + +import com.jd.blockchain.binaryproto.DataContract; +import com.jd.blockchain.binaryproto.DataField; +import com.jd.blockchain.consts.DataCodes; + +@DataContract(code= DataCodes.TX_OP_PARTICIPANT_STATE_UPDATE) +public interface ParticipantStateUpdateOperation extends Operation { + @DataField(order=1, refContract = true) + ParticipantStateUpdateInfo getStateUpdateInfo(); +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java index e9d7fa77..df064ad8 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java @@ -25,6 +25,8 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe private static final ParticipantRegisterOperationBuilderImpl PARTICIPANT_REG_OP_BUILDER = new ParticipantRegisterOperationBuilderImpl(); + private static final ParticipantStateUpdateOperationBuilderImpl PARTICIPANT_STATE_UPDATE_OP_BUILDER = new ParticipantStateUpdateOperationBuilderImpl(); + private LedgerInitOperationBuilder ledgerInitOpBuilder = new LedgerInitOperationBuilderFilter(); private UserRegisterOperationBuilder userRegOpBuilder = new UserRegisterOperationBuilderFilter(); @@ -39,6 +41,8 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe private ParticipantRegisterOperationBuilder participantRegOpBuilder = new ParticipantRegisterOperationBuilderFilter(); + private ParticipantStateUpdateOperationBuilder participantStateModifyOpBuilder = new ParticipantStateUpdateOperationBuilderFilter(); + // TODO: 暂时只支持单线程情形,未考虑多线程; private List operationList = new ArrayList<>(); @@ -79,6 +83,9 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe @Override public ParticipantRegisterOperationBuilder participants() {return participantRegOpBuilder;} + @Override + public ParticipantStateUpdateOperationBuilder states() {return participantStateModifyOpBuilder;} + @Override public T contract(String address, Class contractIntf) { return contractInvoProxyBuilder.create(address, contractIntf, contractEventSendOpBuilder); @@ -262,6 +269,15 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe } } + private class ParticipantStateUpdateOperationBuilderFilter implements ParticipantStateUpdateOperationBuilder { + @Override + public ParticipantStateUpdateOperation update(ParticipantStateUpdateInfo stateUpdateInfo) { + ParticipantStateUpdateOperation op = PARTICIPANT_STATE_UPDATE_OP_BUILDER.update(stateUpdateInfo); + operationList.add(op); + return op; + } + } + private class ContractEventSendOperationBuilderFilter implements ContractEventSendOperationBuilder { @Override diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java index 8797b4ce..ac1dc9f7 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java @@ -6,6 +6,6 @@ package com.jd.blockchain.transaction; * @author huanghaiquan * */ -public interface ClientOperator extends UserOperator, DataAccountOperator, ContractOperator, EventOperator, ParticipantOperator { +public interface ClientOperator extends UserOperator, DataAccountOperator, ContractOperator, EventOperator, ParticipantOperator, ParticipantStateOperator{ } \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateOperator.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateOperator.java new file mode 100644 index 00000000..22554031 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateOperator.java @@ -0,0 +1,10 @@ +package com.jd.blockchain.transaction; + +public interface ParticipantStateOperator { + /** + * 参与方状态更新操作; + * + * @return + */ + ParticipantStateUpdateOperationBuilder states(); +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOpTemplate.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOpTemplate.java new file mode 100644 index 00000000..9a410a1e --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOpTemplate.java @@ -0,0 +1,23 @@ +package com.jd.blockchain.transaction; + +import com.jd.blockchain.binaryproto.DataContractRegistry; +import com.jd.blockchain.ledger.ParticipantStateUpdateInfo; +import com.jd.blockchain.ledger.ParticipantStateUpdateOperation; + +public class ParticipantStateUpdateOpTemplate implements ParticipantStateUpdateOperation { + + static { + DataContractRegistry.register(ParticipantStateUpdateOperation.class); + } + + private ParticipantStateUpdateInfo stateUpdateInfo; + + public ParticipantStateUpdateOpTemplate(ParticipantStateUpdateInfo stateUpdateInfo) { + this.stateUpdateInfo = stateUpdateInfo; + } + + @Override + public ParticipantStateUpdateInfo getStateUpdateInfo() { + return stateUpdateInfo; + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilder.java new file mode 100644 index 00000000..afb66bff --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilder.java @@ -0,0 +1,18 @@ +package com.jd.blockchain.transaction; + +import com.jd.blockchain.ledger.ParticipantStateUpdateInfo; +import com.jd.blockchain.ledger.ParticipantStateUpdateOperation; + +public interface ParticipantStateUpdateOperationBuilder { + + /** + * 更新参与方状态,已注册->参与共识; + * + * @param + * + * @param + * + * @return + */ + ParticipantStateUpdateOperation update(ParticipantStateUpdateInfo stateUpdateInfo); +} \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilderImpl.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilderImpl.java new file mode 100644 index 00000000..7c579fd7 --- /dev/null +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilderImpl.java @@ -0,0 +1,12 @@ +package com.jd.blockchain.transaction; + +import com.jd.blockchain.ledger.ParticipantStateUpdateInfo; +import com.jd.blockchain.ledger.ParticipantStateUpdateOperation; + +public class ParticipantStateUpdateOperationBuilderImpl implements ParticipantStateUpdateOperationBuilder { + + @Override + public ParticipantStateUpdateOperation update(ParticipantStateUpdateInfo stateUpdateInfo) { + return new ParticipantStateUpdateOpTemplate(stateUpdateInfo); + } +} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java index 9a810c56..b3b7ca7b 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxBuilder.java @@ -113,6 +113,9 @@ public class TxBuilder implements TransactionBuilder { @Override public ParticipantRegisterOperationBuilder participants() {return opFactory.participants(); } + @Override + public ParticipantStateUpdateOperationBuilder states() {return opFactory.states(); } + @Override public T contract(Bytes address, Class contractIntf) { return opFactory.contract(address, contractIntf); diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxTemplate.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxTemplate.java index e448db0e..7b407f61 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxTemplate.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/TxTemplate.java @@ -71,6 +71,12 @@ public class TxTemplate implements TransactionTemplate { return txBuilder.participants(); } + @Override + public ParticipantStateUpdateOperationBuilder states() { + stateManager.operate(); + return txBuilder.states(); + } + @Override public T contract(Bytes address, Class contractIntf) { stateManager.operate(); diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java similarity index 98% rename from source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Test_.java rename to source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java index c4e0e76a..382e1581 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Test_.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java @@ -20,7 +20,7 @@ import static org.junit.Assert.assertTrue; * @since 1.0.0 */ -public class SDK_GateWay_Participant_Test_ { +public class SDK_GateWay_Participant_Regist_Test_ { private PrivKey privKey; private PubKey pubKey; diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java new file mode 100644 index 00000000..c286dc66 --- /dev/null +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java @@ -0,0 +1,91 @@ +package test.com.jd.blockchain.sdk.test; + +import com.jd.blockchain.binaryproto.DataContractRegistry; +import com.jd.blockchain.crypto.*; +import com.jd.blockchain.ledger.*; +import com.jd.blockchain.sdk.BlockchainService; +import com.jd.blockchain.sdk.client.GatewayServiceFactory; +import com.jd.blockchain.sdk.samples.SDKDemo_Constant; +import com.jd.blockchain.tools.keygen.KeyGenCommand; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +/** + * 参与方状态更新测试 + * @author zhangshuang + * @create 2019/7/18 + * @since 1.0.0 + */ +public class SDK_GateWay_Participant_State_Update_Test_ { + private PrivKey privKey; + private PubKey pubKey; + + private BlockchainKeypair CLIENT_CERT = null; + + private String GATEWAY_IPADDR = null; + + private int GATEWAY_PORT; + + private boolean SECURE; + + private BlockchainService service; + + //根据密码工具产生的公私钥 + static String PUB = "3snPdw7i7PkdgqiGX7GbZuFSi1cwZn7vtjw4vifb1YoXgr9k6Kfmis"; + String PRIV = "177gjtZu8w1phqHFVNiFhA35cfimXmP6VuqrBFhfbXBWK8s4TRwro2tnpffwP1Emwr6SMN6"; + + @Before + public void init() { + + privKey = SDK_GateWay_KeyPair_Para.privkey1; + pubKey = SDK_GateWay_KeyPair_Para.pubKey1; + + CLIENT_CERT = new BlockchainKeypair(SDK_GateWay_KeyPair_Para.pubKey0, SDK_GateWay_KeyPair_Para.privkey0); + GATEWAY_IPADDR = "127.0.0.1"; + GATEWAY_PORT = 11000; + SECURE = false; + GatewayServiceFactory serviceFactory = GatewayServiceFactory.connect(GATEWAY_IPADDR, GATEWAY_PORT, SECURE, + CLIENT_CERT); + service = serviceFactory.getBlockchainService(); + + DataContractRegistry.register(TransactionContent.class); + DataContractRegistry.register(TransactionContentBody.class); + DataContractRegistry.register(TransactionRequest.class); + DataContractRegistry.register(NodeRequest.class); + DataContractRegistry.register(EndpointRequest.class); + DataContractRegistry.register(TransactionResponse.class); + } + + @Test + public void updateParticipantState_Test() { + HashDigest[] ledgerHashs = service.getLedgerHashs(); + // 在本地定义注册账号的 TX; + TransactionTemplate txTemp = service.newTransaction(ledgerHashs[0]); + + //existed signer + AsymmetricKeypair keyPair = new BlockchainKeypair(pubKey, privKey); + + PrivKey privKey = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); + + PubKey pubKey = KeyGenCommand.decodePubKey(PUB); + + System.out.println("Address = "+AddressEncoding.generateAddress(pubKey)); + + + ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(pubKey, ParticipantNodeState.CONSENSUSED); + txTemp.states().update(stateUpdateInfo); + + // TX 准备就绪; + PreparedTransaction prepTx = txTemp.prepare(); + + // 使用私钥进行签名; + prepTx.sign(keyPair); + + // 提交交易; + TransactionResponse transactionResponse = prepTx.commit(); + assertTrue(transactionResponse.isSuccess()); + + } +} diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java index c553dcd9..32c02b75 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java @@ -25,6 +25,7 @@ import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicLong; +import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.*; import org.apache.commons.io.FileUtils; import org.springframework.core.io.ClassPathResource; @@ -195,6 +196,32 @@ public class IntegrationBase { return keyPairResponse; } + public static KeyPairResponse testSDK_UpdateParticipantState(AsymmetricKeypair adminKey, BlockchainKeypair participantKeyPair, HashDigest ledgerHash, + BlockchainService blockchainService) { + // 定义交易; + TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); + + ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(participantKeyPair.getPubKey(), ParticipantNodeState.CONSENSUSED); + + txTpl.states().update(stateUpdateInfo); + + // 签名; + PreparedTransaction ptx = txTpl.prepare(); + + HashDigest transactionHash = ptx.getHash(); + + ptx.sign(adminKey); + + // 提交并等待共识返回; + TransactionResponse txResp = ptx.commit(); + + KeyPairResponse keyPairResponse = new KeyPairResponse(); + keyPairResponse.keyPair = participantKeyPair; + keyPairResponse.txResp = txResp; + keyPairResponse.txHash = transactionHash; + return keyPairResponse; + } + public static void validKeyPair(IntegrationBase.KeyPairResponse keyPairResponse, LedgerRepository ledgerRepository, KeyPairType keyPairType) { TransactionResponse txResp = keyPairResponse.txResp; diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java index fd93a2c0..f9954ce1 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java @@ -6,6 +6,9 @@ import com.jd.blockchain.crypto.PrivKey; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.gateway.GatewayConfigProperties; import com.jd.blockchain.ledger.BlockchainKeypair; +import com.jd.blockchain.ledger.ParticipantNodeState; +import com.jd.blockchain.ledger.ParticipantStateUpdateInfo; +import com.jd.blockchain.ledger.ParticipantStateUpdateInfoData; import com.jd.blockchain.ledger.core.LedgerRepository; import com.jd.blockchain.sdk.BlockchainService; import com.jd.blockchain.sdk.client.GatewayServiceFactory; @@ -32,6 +35,8 @@ public class IntegrationTest4Bftsmart { private static final boolean isRegisterParticipant = true; + private static final boolean isParticipantStateUpdate = true; + private static final boolean isWriteKv = true; private static final String DB_TYPE_MEM = "mem"; @@ -148,8 +153,9 @@ public class IntegrationTest4Bftsmart { System.out.printf("before add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + IntegrationBase.KeyPairResponse participantResponse; if (isRegisterParticipant) { - IntegrationBase.KeyPairResponse participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); + participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); } participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); @@ -158,6 +164,21 @@ public class IntegrationTest4Bftsmart { System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + System.out.println("update participant state before \r\n"); + + for (int i = 0; i < participantCount; i++) { + System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); + } + + if (isParticipantStateUpdate) { + IntegrationBase.testSDK_UpdateParticipantState(adminKey, new BlockchainKeypair(participantResponse.getKeyPair().getPubKey(), participantResponse.getKeyPair().getPrivKey()), ledgerHash, blockchainService); + } + + System.out.println("update participant state after\r\n"); + + for (int i = 0; i < participantCount; i++) { + System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); + } try { System.out.println("----------------- Init Completed -----------------"); diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java index f7315d17..216010cb 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java @@ -32,6 +32,8 @@ public class IntegrationTest4MQ { private static final boolean isRegisterParticipant = true; + private static final boolean isParticipantStateUpdate = true; + private static final boolean isWriteKv = true; private static final boolean isContract = false; @@ -146,8 +148,9 @@ public class IntegrationTest4MQ { System.out.printf("before add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + IntegrationBase.KeyPairResponse participantResponse; if (isRegisterParticipant) { - IntegrationBase.KeyPairResponse participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); + participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); } participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); @@ -156,6 +159,24 @@ public class IntegrationTest4MQ { System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); + + System.out.println("update participant state before \r\n"); + + for (int i = 0; i < participantCount; i++) { + System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); + } + + if (isParticipantStateUpdate) { + IntegrationBase.testSDK_UpdateParticipantState(adminKey, new BlockchainKeypair(participantResponse.getKeyPair().getPubKey(), participantResponse.getKeyPair().getPrivKey()), ledgerHash, blockchainService); + } + + System.out.println("update participant state after\r\n"); + + for (int i = 0; i < participantCount; i++) { + System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); + } + IntegrationBase.testConsistencyAmongNodes(ledgers); if(isOnline){ From 3c26584a9f2cc2b5823c805f8707b255b5306f5e Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Thu, 29 Aug 2019 18:32:37 +0800 Subject: [PATCH 07/15] print bug --- .../java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java index 216010cb..a3735e1d 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java @@ -159,8 +159,6 @@ public class IntegrationTest4MQ { System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); - System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); - System.out.println("update participant state before \r\n"); for (int i = 0; i < participantCount; i++) { From 13d2218f299401e09fa33e9b0e4ce117ec02e81f Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Mon, 2 Sep 2019 17:20:09 +0800 Subject: [PATCH 08/15] modify participant state update interface bug --- .../src/main/java/com/jd/blockchain/ContractDeployExeUtil.java | 1 + .../test/com/jd/blockchain/ledger/ContractInvokingTest.java | 1 + .../java/test/com/jd/blockchain/ledger/LedgerManagerTest.java | 1 + .../java/test/com/jd/blockchain/ledger/TransactionSetTest.java | 1 + .../jd/blockchain/web/converters/BinaryMessageConverter.java | 1 + .../java/com/jd/blockchain/peer/web/ManagementController.java | 1 + .../com/jd/blockchain/sdk/client/GatewayServiceFactory.java | 1 + .../sdk/test/SDK_GateWay_Participant_Regist_Test_.java | 2 ++ .../sdk/test/SDK_GateWay_Participant_State_Update_Test_.java | 3 +++ .../com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java | 1 + .../com/jd/blockchain/capability/service/SettingsInit.java | 1 + .../main/java/com/jd/blockchain/mocker/MockerNodeContext.java | 2 ++ 12 files changed, 16 insertions(+) diff --git a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java index 24a25a90..157abcbb 100644 --- a/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java +++ b/source/contract/contract-maven-plugin/src/main/java/com/jd/blockchain/ContractDeployExeUtil.java @@ -95,6 +95,7 @@ public enum ContractDeployExeUtil { DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); } public BlockchainService initBcsrv(String host, int port) { diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java index 3ee6f875..0523ec64 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/ContractInvokingTest.java @@ -33,6 +33,7 @@ public class ContractInvokingTest { DataContractRegistry.register(TransactionResponse.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); } private static final String LEDGER_KEY_PREFIX = "LDG://"; diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java index a38e5ca8..3cd1a26d 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/LedgerManagerTest.java @@ -45,6 +45,7 @@ public class LedgerManagerTest { DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); DataContractRegistry.register(BlockBody.class); DataContractRegistry.register(CryptoProvider.class); } diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/TransactionSetTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/TransactionSetTest.java index ebfdc55a..bb7cec55 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/TransactionSetTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/TransactionSetTest.java @@ -37,6 +37,7 @@ public class TransactionSetTest { DataContractRegistry.register(ContractCodeDeployOperation.class); DataContractRegistry.register(ContractEventSendOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); CryptoSetting defCryptoSetting = LedgerTestUtils.createDefaultCryptoSetting(); MemoryKVStorage testStorage = new MemoryKVStorage(); diff --git a/source/ledger/ledger-rpc/src/main/java/com/jd/blockchain/web/converters/BinaryMessageConverter.java b/source/ledger/ledger-rpc/src/main/java/com/jd/blockchain/web/converters/BinaryMessageConverter.java index b2683e2f..0814de76 100644 --- a/source/ledger/ledger-rpc/src/main/java/com/jd/blockchain/web/converters/BinaryMessageConverter.java +++ b/source/ledger/ledger-rpc/src/main/java/com/jd/blockchain/web/converters/BinaryMessageConverter.java @@ -47,6 +47,7 @@ public class BinaryMessageConverter extends AbstractHttpMessageConverter DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); DataContractRegistry.register(ActionRequest.class); DataContractRegistry.register(ActionResponse.class); diff --git a/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java b/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java index ec2443a3..04b71c41 100644 --- a/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java +++ b/source/peer/src/main/java/com/jd/blockchain/peer/web/ManagementController.java @@ -103,6 +103,7 @@ public class ManagementController implements LedgerBindingConfigAware, PeerManag DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); DataContractRegistry.register(ActionResponse.class); diff --git a/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java b/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java index df8a4991..7e0729a7 100644 --- a/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java +++ b/source/sdk/sdk-client/src/main/java/com/jd/blockchain/sdk/client/GatewayServiceFactory.java @@ -48,6 +48,7 @@ public class GatewayServiceFactory implements BlockchainServiceFactory, Closeabl DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); DataContractRegistry.register(ActionRequest.class); DataContractRegistry.register(ActionResponse.class); diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java index 382e1581..ec523269 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java @@ -59,6 +59,8 @@ public class SDK_GateWay_Participant_Regist_Test_ { DataContractRegistry.register(NodeRequest.class); DataContractRegistry.register(EndpointRequest.class); DataContractRegistry.register(TransactionResponse.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); } @Test diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java index c286dc66..f77397c8 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java @@ -56,6 +56,9 @@ public class SDK_GateWay_Participant_State_Update_Test_ { DataContractRegistry.register(NodeRequest.class); DataContractRegistry.register(EndpointRequest.class); DataContractRegistry.register(TransactionResponse.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); } @Test diff --git a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java index 7f6ee769..baae348a 100644 --- a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java +++ b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/LedgerPerformanceTest.java @@ -77,6 +77,7 @@ public class LedgerPerformanceTest { DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(DataAccountKVSetOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); } public static void test(String[] args) { diff --git a/source/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java b/source/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java index f6c9bced..868a8e09 100644 --- a/source/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java +++ b/source/tools/tools-capability/src/main/java/com/jd/blockchain/capability/service/SettingsInit.java @@ -47,6 +47,7 @@ public class SettingsInit { DataContractRegistry.register(DataAccountRegisterOperation.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); DataContractRegistry.register(ActionResponse.class); diff --git a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java index 56aced5d..312bcc45 100644 --- a/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java +++ b/source/tools/tools-mocker/src/main/java/com/jd/blockchain/mocker/MockerNodeContext.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Properties; +import com.jd.blockchain.binaryproto.DataContract; import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.consensus.ClientIdentification; import com.jd.blockchain.consensus.ClientIdentifications; @@ -89,6 +90,7 @@ public class MockerNodeContext implements BlockchainQueryService { DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(DataAccountKVSetOperation.class); DataContractRegistry.register(DataAccountKVSetOperation.KVWriteEntry.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); DataContractRegistry.register(ActionRequest.class); DataContractRegistry.register(ActionResponse.class); From d88feabb77efe853efe2c972faf3263bebe44921 Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Tue, 3 Sep 2019 16:39:40 +0800 Subject: [PATCH 09/15] modify participant state update bug --- .../ParticipantRegisterOperationHandle.java | 12 ++++++------ .../ParticipantStateUpdateOperationHandle.java | 18 ++++++++++++++++++ .../ledger/ParticipantStateUpdateInfo.java | 12 +++++++++++- .../ledger/ParticipantStateUpdateInfoData.java | 14 +++++++++++++- ...GateWay_Participant_State_Update_Test_.java | 4 +++- .../jd/blockchain/intgr/IntegrationBase.java | 4 +++- 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java index 255a8eb9..d0e47e52 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantRegisterOperationHandle.java @@ -20,11 +20,11 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { ParticipantInfo participantInfo = participantRegOp.getParticipantInfo(); - ConsensusProvider provider = ConsensusProviders.getProvider(adminAccount.getSetting().getConsensusProvider()); +// ConsensusProvider provider = ConsensusProviders.getProvider(adminAccount.getSetting().getConsensusProvider()); ParticipantNode participantNode = new PartNode((int)(adminAccount.getParticipantCount()), participantInfo.getName(), participantInfo.getPubKey(), ParticipantNodeState.REGISTED); - LedgerAdminAccount.LedgerMetadataImpl metadata = (LedgerAdminAccount.LedgerMetadataImpl) adminAccount.getMetadata(); +// LedgerAdminAccount.LedgerMetadataImpl metadata = (LedgerAdminAccount.LedgerMetadataImpl) adminAccount.getMetadata(); PubKey pubKey = participantNode.getPubKey(); @@ -32,12 +32,12 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { BlockchainIdentityData identityData = new BlockchainIdentityData(pubKey); //update consensus setting - Bytes newConsensusSettings = provider.getSettingsFactory().getConsensusSettingsBuilder().updateSettings(metadata.getSetting().getConsensusSetting(), participantInfo); +// Bytes newConsensusSettings = provider.getSettingsFactory().getConsensusSettingsBuilder().updateSettings(metadata.getSetting().getConsensusSetting(), participantInfo); - LedgerSetting ledgerSetting = new LedgerConfiguration(adminAccount.getSetting().getConsensusProvider(), - newConsensusSettings, metadata.getSetting().getCryptoSetting()); +// LedgerSetting ledgerSetting = new LedgerConfiguration(adminAccount.getSetting().getConsensusProvider(), +// newConsensusSettings, metadata.getSetting().getCryptoSetting()); - metadata.setSetting(ledgerSetting); +// metadata.setSetting(ledgerSetting); // metadata.setViewId(metadata.getViewId() + 1); //reg participant as user diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantStateUpdateOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantStateUpdateOperationHandle.java index bb0d5b65..0976651f 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantStateUpdateOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/handles/ParticipantStateUpdateOperationHandle.java @@ -1,10 +1,13 @@ package com.jd.blockchain.ledger.core.impl.handles; +import com.jd.blockchain.consensus.ConsensusProvider; +import com.jd.blockchain.consensus.ConsensusProviders; import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.*; import com.jd.blockchain.ledger.core.impl.OperationHandleContext; +import com.jd.blockchain.utils.Bytes; public class ParticipantStateUpdateOperationHandle implements OperationHandle { @@ -20,6 +23,10 @@ public class ParticipantStateUpdateOperationHandle implements OperationHandle { LedgerAdminAccount adminAccount = newBlockDataset.getAdminAccount(); + ConsensusProvider provider = ConsensusProviders.getProvider(adminAccount.getSetting().getConsensusProvider()); + + LedgerAdminAccount.LedgerMetadataImpl metadata = (LedgerAdminAccount.LedgerMetadataImpl) adminAccount.getMetadata(); + ParticipantNode[] participants = adminAccount.getParticipants(); ParticipantNode participantNode = null; @@ -27,9 +34,20 @@ public class ParticipantStateUpdateOperationHandle implements OperationHandle { for(int i = 0; i < participants.length; i++) { if (stateUpdateOperation.getStateUpdateInfo().getPubKey().equals(participants[i].getPubKey())) { participantNode = new PartNode(participants[i].getId(), participants[i].getName(), participants[i].getPubKey(), ParticipantNodeState.CONSENSUSED); + break; } } + //update consensus setting + ParticipantInfo participantInfo = new ParticipantInfoData("", participantNode.getName(), participantNode.getPubKey(), stateUpdateOperation.getStateUpdateInfo().getNetworkAddress()); + + Bytes newConsensusSettings = provider.getSettingsFactory().getConsensusSettingsBuilder().updateSettings(metadata.getSetting().getConsensusSetting(), participantInfo); + + LedgerSetting ledgerSetting = new LedgerConfiguration(adminAccount.getSetting().getConsensusProvider(), + newConsensusSettings, metadata.getSetting().getCryptoSetting()); + + metadata.setSetting(ledgerSetting); + adminAccount.updateParticipant(participantNode); return null; diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfo.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfo.java index 8452ac92..70c89f3f 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfo.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfo.java @@ -5,6 +5,7 @@ import com.jd.blockchain.binaryproto.DataField; import com.jd.blockchain.binaryproto.PrimitiveType; import com.jd.blockchain.consts.DataCodes; import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.utils.net.NetworkAddress; /** * 参与方状态更新信息; @@ -13,6 +14,7 @@ import com.jd.blockchain.crypto.PubKey; */ @DataContract(code = DataCodes.METADATA_PARTICIPANT_STATE_INFO) public interface ParticipantStateUpdateInfo { + /** * 公钥; * @@ -21,11 +23,19 @@ public interface ParticipantStateUpdateInfo { @DataField(order = 1, primitiveType = PrimitiveType.BYTES) PubKey getPubKey(); + /** + * 共识协议的网络地址; + * + * @return + */ + @DataField(order = 2, primitiveType = PrimitiveType.BYTES) + NetworkAddress getNetworkAddress(); + /** * 参与方状态; * * @return */ - @DataField(order = 2, refEnum = true) + @DataField(order = 3, refEnum = true) ParticipantNodeState getState(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfoData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfoData.java index 1f4a4fc5..5e11c178 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfoData.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateInfoData.java @@ -1,14 +1,17 @@ package com.jd.blockchain.ledger; import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.utils.net.NetworkAddress; public class ParticipantStateUpdateInfoData implements ParticipantStateUpdateInfo { private PubKey pubKey; private ParticipantNodeState state; + private NetworkAddress networkAddress; - public ParticipantStateUpdateInfoData(PubKey pubKey, ParticipantNodeState state) { + public ParticipantStateUpdateInfoData(PubKey pubKey, ParticipantNodeState state, NetworkAddress networkAddress) { this.pubKey = pubKey; this.state = state; + this.networkAddress = networkAddress; } public void setPubKey(PubKey pubKey) { @@ -20,6 +23,15 @@ public class ParticipantStateUpdateInfoData implements ParticipantStateUpdateInf return pubKey; } + public void setNetworkAddress(NetworkAddress networkAddress) { + this.networkAddress = networkAddress; + } + + @Override + public NetworkAddress getNetworkAddress() { + return networkAddress; + } + public void setState(ParticipantNodeState state) { this.state = state; } diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java index f77397c8..ea04ef69 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java @@ -7,6 +7,7 @@ import com.jd.blockchain.sdk.BlockchainService; import com.jd.blockchain.sdk.client.GatewayServiceFactory; import com.jd.blockchain.sdk.samples.SDKDemo_Constant; import com.jd.blockchain.tools.keygen.KeyGenCommand; +import com.jd.blockchain.utils.net.NetworkAddress; import org.junit.Before; import org.junit.Test; @@ -76,8 +77,9 @@ public class SDK_GateWay_Participant_State_Update_Test_ { System.out.println("Address = "+AddressEncoding.generateAddress(pubKey)); + NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); - ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(pubKey, ParticipantNodeState.CONSENSUSED); + ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(pubKey, ParticipantNodeState.CONSENSUSED, networkAddress); txTemp.states().update(stateUpdateInfo); // TX 准备就绪; diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java index 32c02b75..d5d8f3af 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java @@ -201,7 +201,9 @@ public class IntegrationBase { // 定义交易; TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); - ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(participantKeyPair.getPubKey(), ParticipantNodeState.CONSENSUSED); + ParticipantInfoData participantInfoData = new ParticipantInfoData("add", "peer4", participantKeyPair.getPubKey(), new NetworkAddress("127.0.0.1", 20000)); + + ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(participantKeyPair.getPubKey(), ParticipantNodeState.CONSENSUSED, participantInfoData.getNetworkAddress()); txTpl.states().update(stateUpdateInfo); From 51c653033840f80f0900cf34e3538967dcb9fdf1 Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Tue, 3 Sep 2019 18:52:50 +0800 Subject: [PATCH 10/15] modify participant state update bug --- .../blockchain/intgr/IntegrationTest4Bftsmart.java | 10 ++++++++-- .../com/jd/blockchain/intgr/IntegrationTest4MQ.java | 13 +++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java index f9954ce1..a7157d39 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java @@ -1,5 +1,7 @@ package test.com.jd.blockchain.intgr; +import com.jd.blockchain.consensus.ConsensusProviders; +import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusSettings; import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.PrivKey; @@ -45,6 +47,8 @@ public class IntegrationTest4Bftsmart { private static final String DB_TYPE_ROCKSDB = "rocksdb"; + public static final String BFTSMART_PROVIDER = "com.jd.blockchain.consensus.bftsmart.BftsmartConsensusProvider"; + @Test public void test4Memory() { test(LedgerInitConsensusConfig.bftsmartProvider, DB_TYPE_MEM, LedgerInitConsensusConfig.memConnectionStrings); @@ -164,7 +168,8 @@ public class IntegrationTest4Bftsmart { System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); - System.out.println("update participant state before \r\n"); + BftsmartConsensusSettings consensusSettings = (BftsmartConsensusSettings) ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminAccount().getSetting().getConsensusSetting().toBytes()); + System.out.printf("update participant state before ,old consensus env node num = %d\r\n", consensusSettings.getNodes().length); for (int i = 0; i < participantCount; i++) { System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); @@ -174,8 +179,9 @@ public class IntegrationTest4Bftsmart { IntegrationBase.testSDK_UpdateParticipantState(adminKey, new BlockchainKeypair(participantResponse.getKeyPair().getPubKey(), participantResponse.getKeyPair().getPrivKey()), ledgerHash, blockchainService); } - System.out.println("update participant state after\r\n"); + BftsmartConsensusSettings consensusSettingsNew = (BftsmartConsensusSettings) ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getSetting().getConsensusSetting().toBytes()); + System.out.printf("update participant state after ,new consensus env node num = %d\r\n", consensusSettingsNew.getNodes().length); for (int i = 0; i < participantCount; i++) { System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); } diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java index a3735e1d..38619459 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java @@ -1,5 +1,8 @@ package test.com.jd.blockchain.intgr; +import com.jd.blockchain.consensus.ConsensusProviders; +import com.jd.blockchain.consensus.bftsmart.BftsmartConsensusSettings; +import com.jd.blockchain.consensus.mq.settings.MsgQueueConsensusSettings; import com.jd.blockchain.crypto.AsymmetricKeypair; import com.jd.blockchain.crypto.HashDigest; import com.jd.blockchain.crypto.PrivKey; @@ -48,6 +51,8 @@ public class IntegrationTest4MQ { private static final String DATA_RETRIEVAL_URL= "http://192.168.151.39:10001"; + public static final String MQ_PROVIDER = "com.jd.blockchain.consensus.mq.MsgQueueConsensusProvider"; + @Test public void test4Memory() { test(LedgerInitConsensusConfig.mqProvider, DB_TYPE_MEM, LedgerInitConsensusConfig.memConnectionStrings); @@ -159,7 +164,9 @@ public class IntegrationTest4MQ { System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); - System.out.println("update participant state before \r\n"); + MsgQueueConsensusSettings consensusSettings = (MsgQueueConsensusSettings) ConsensusProviders.getProvider(MQ_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminAccount().getSetting().getConsensusSetting().toBytes()); + + System.out.printf("update participant state before ,old consensus env node num = %d\r\n", consensusSettings.getNodes().length); for (int i = 0; i < participantCount; i++) { System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); @@ -169,7 +176,9 @@ public class IntegrationTest4MQ { IntegrationBase.testSDK_UpdateParticipantState(adminKey, new BlockchainKeypair(participantResponse.getKeyPair().getPubKey(), participantResponse.getKeyPair().getPrivKey()), ledgerHash, blockchainService); } - System.out.println("update participant state after\r\n"); + BftsmartConsensusSettings consensusSettingsNew = (BftsmartConsensusSettings) ConsensusProviders.getProvider(MQ_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getSetting().getConsensusSetting().toBytes()); + + System.out.printf("update participant state after ,new consensus env node num = %d\r\n", consensusSettingsNew.getNodes().length); for (int i = 0; i < participantCount; i++) { System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); From ef901c6518b929b0e01942814b793044d12a3a03 Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Mon, 9 Sep 2019 10:51:30 +0800 Subject: [PATCH 11/15] temp; --- .../src/main/java/com/jd/blockchain/consts/DataCodes.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java index bf262ef0..26b52692 100644 --- a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java +++ b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java @@ -100,8 +100,8 @@ public interface DataCodes { // public static final int METADATA_CONSENSUS_SETTING = 0x631; // // 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_CONSENSUS_NODE = 0x630; From 6954e4eea009687b18f6090e4fdca61ebdae565c Mon Sep 17 00:00:00 2001 From: huanghaiquan Date: Mon, 9 Sep 2019 13:52:42 +0800 Subject: [PATCH 12/15] temp; --- .../handles/ParticipantRegisterOperationHandle.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java index d0e47e52..ece04036 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java @@ -40,11 +40,18 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { // metadata.setSetting(ledgerSetting); // metadata.setViewId(metadata.getViewId() + 1); - //reg participant as user - dataset.getUserAccountSet().register(identityData.getAddress(), pubKey); + + +// //reg participant as user +// dataset.getUserAccountSet().register(identityData.getAddress(), pubKey); //add new participant as consensus node adminAccount.addParticipant(participantNode); + + // Build UserRegisterOperation; + UserRegisterOperation userRegOp = null;// + handleContext.handle(userRegOp); + return null; } From 4b48e9a22b46c66d5b9872d7d16ad87aae3c147c Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Tue, 10 Sep 2019 11:28:14 +0800 Subject: [PATCH 13/15] Initial revision of the code merger --- .../DefaultOperationHandleRegisteration.java | 13 +- .../ledger/core/LedgerAdminAccount.java | 365 ------------------ .../ledger/core/LedgerAdminDataset.java | 12 + .../ParticipantRegisterOperationHandle.java | 60 ++- ...ParticipantStateUpdateOperationHandle.java | 45 +-- .../DefaultOperationHandleRegisteration.java | 61 --- .../jd/blockchain/ledger/ParticipantInfo.java | 6 +- .../ledger/ParticipantInfoData.java | 14 +- .../sdk/converters/ClientResolveUtil.java | 26 +- .../SDK_GateWay_Participant_Regist_Test_.java | 6 +- ...ateWay_Participant_State_Update_Test_.java | 4 +- .../com/jd/blockchain/intgr/perf/Utils.java | 2 +- .../jd/blockchain/intgr/IntegrationBase.java | 4 +- .../intgr/IntegrationTest4Bftsmart.java | 12 +- .../blockchain/intgr/IntegrationTest4MQ.java | 12 +- 15 files changed, 92 insertions(+), 550 deletions(-) delete mode 100644 source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java delete mode 100644 source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DefaultOperationHandleRegisteration.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DefaultOperationHandleRegisteration.java index 6dd34e0a..5e156ec3 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DefaultOperationHandleRegisteration.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DefaultOperationHandleRegisteration.java @@ -6,18 +6,11 @@ import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import com.jd.blockchain.ledger.core.handles.*; import org.springframework.stereotype.Component; import com.jd.blockchain.ledger.LedgerException; import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.core.handles.ContractCodeDeployOperationHandle; -import com.jd.blockchain.ledger.core.handles.DataAccountKVSetOperationHandle; -import com.jd.blockchain.ledger.core.handles.DataAccountRegisterOperationHandle; -import com.jd.blockchain.ledger.core.handles.JVMContractEventSendOperationHandle; -import com.jd.blockchain.ledger.core.handles.LedgerInitOperationHandle; -import com.jd.blockchain.ledger.core.handles.RolesConfigureOperationHandle; -import com.jd.blockchain.ledger.core.handles.UserAuthorizeOperationHandle; -import com.jd.blockchain.ledger.core.handles.UserRegisterOperationHandle; import com.jd.blockchain.transaction.ContractCodeDeployOpTemplate; import com.jd.blockchain.transaction.ContractEventSendOpTemplate; import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; @@ -50,6 +43,10 @@ public class DefaultOperationHandleRegisteration implements OperationHandleRegis registerDefaultHandle(new ContractCodeDeployOperationHandle()); registerDefaultHandle(new JVMContractEventSendOperationHandle()); + + registerDefaultHandle(new ParticipantRegisterOperationHandle()); + + registerDefaultHandle(new ParticipantStateUpdateOperationHandle()); } private static void registerDefaultHandle(OperationHandle handle) { diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java deleted file mode 100644 index 87219e84..00000000 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java +++ /dev/null @@ -1,365 +0,0 @@ -package com.jd.blockchain.ledger.core; - -import com.jd.blockchain.ledger.LedgerMetadata; -import com.jd.blockchain.ledger.LedgerSetting; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -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.crypto.HashFunction; -import com.jd.blockchain.ledger.LedgerException; -import com.jd.blockchain.ledger.LedgerInitSetting; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.storage.service.ExPolicyKVStorage; -import com.jd.blockchain.storage.service.ExPolicyKVStorage.ExPolicy; -import com.jd.blockchain.storage.service.VersioningKVStorage; -import com.jd.blockchain.utils.Bytes; -import com.jd.blockchain.utils.Transactional; - -public class LedgerAdminAccount implements Transactional, LedgerAdministration { - - static { - DataContractRegistry.register(LedgerMetadata.class); - } - - private static Logger LOGGER = LoggerFactory.getLogger(LedgerAdminAccount.class); - - public static final String LEDGER_META_PREFIX = "MTA" + LedgerConsts.KEY_SEPERATOR; - public static final String LEDGER_PARTICIPANT_PREFIX = "PAR" + LedgerConsts.KEY_SEPERATOR; - public static final String LEDGER_PRIVILEGE_PREFIX = "PVL" + LedgerConsts.KEY_SEPERATOR; - - private final Bytes metaPrefix; - private final Bytes privilegePrefix; - - private LedgerMetadata origMetadata; - - private LedgerMetadataImpl metadata; - - /** - * 原来的账本设置; - * - *
- * 对 LedgerMetadata 修改的新配置不能立即生效,需要达成共识后,在下一次区块计算中才生效; - */ - private LedgerSetting previousSetting; - - /** - * 账本的参与节点; - */ - private ParticipantDataSet participants; - - // /** - // * 账本的全局权限设置; - // */ - // private PrivilegeDataSet privileges; - - private ExPolicyKVStorage settingsStorage; - - private HashDigest adminAccountHash; - - private boolean readonly; - - private boolean updated; - - public HashDigest getHash() { - return adminAccountHash; - } - - public boolean isReadonly() { - return readonly; - } - - /** - * 初始化账本的管理账户; - * - *
- * - * 只在新建账本时调用此方法; - * - * @param ledgerSeed - * @param setting - * @param partiList - * @param exPolicyStorage - * @param versioningStorage - */ - public LedgerAdminAccount(LedgerInitSetting initSetting, String keyPrefix, ExPolicyKVStorage exPolicyStorage, - VersioningKVStorage versioningStorage) { - this.metaPrefix = Bytes.fromString(keyPrefix + LEDGER_META_PREFIX); - this.privilegePrefix = Bytes.fromString(keyPrefix + LEDGER_PRIVILEGE_PREFIX); - - ParticipantNode[] parties = initSetting.getConsensusParticipants(); - if (parties.length == 0) { - throw new LedgerException("No participant!"); - } - - // 检查参与者列表是否已经按照 id 升序排列,并且 id 不冲突; - // 注:参与者的 id 要求从 0 开始编号,顺序依次递增,不允许跳空; - for (int i = 0; i < parties.length; i++) { - // if (parties[i].getAddress() != i) { - // throw new LedgerException("The id of participant isn't match the order of the - // participant list!"); - // } - } - - // 初始化元数据; - this.metadata = new LedgerMetadataImpl(); - this.metadata.setSeed(initSetting.getLedgerSeed()); - // 新配置; - this.metadata.setting = new LedgerConfiguration(initSetting.getConsensusProvider(), - initSetting.getConsensusSettings(), initSetting.getCryptoSetting()); - this.previousSetting = new LedgerConfiguration(initSetting.getConsensusProvider(), - initSetting.getConsensusSettings(), initSetting.getCryptoSetting()); - this.adminAccountHash = null; - - // 基于原配置初始化参与者列表; - String partiPrefix = keyPrefix + LEDGER_PARTICIPANT_PREFIX; - this.participants = new ParticipantDataSet(previousSetting.getCryptoSetting(), partiPrefix, exPolicyStorage, - versioningStorage); - - for (ParticipantNode p : parties) { - this.participants.addConsensusParticipant(p); - } - - // 初始化其它属性; - this.settingsStorage = exPolicyStorage; - this.readonly = false; - } - - public LedgerAdminAccount(HashDigest adminAccountHash, String keyPrefix, ExPolicyKVStorage kvStorage, - VersioningKVStorage versioningKVStorage, boolean readonly) { - this.metaPrefix = Bytes.fromString(keyPrefix + LEDGER_META_PREFIX); - this.privilegePrefix = Bytes.fromString(keyPrefix + LEDGER_PRIVILEGE_PREFIX); - this.settingsStorage = kvStorage; - this.readonly = readonly; - this.origMetadata = loadAndVerifySettings(adminAccountHash); - this.metadata = new LedgerMetadataImpl(origMetadata); - // 复制记录一份配置作为上一个区块的原始配置,该实例仅供读取,不做修改,也不会回写到存储; - this.previousSetting = new LedgerConfiguration(metadata.getSetting()); - this.adminAccountHash = adminAccountHash; - // this.privileges = new PrivilegeDataSet(metadata.getPrivilegesHash(), - // metadata.getSetting().getCryptoSetting(), - // PrefixAppender.prefix(LEDGER_PRIVILEGE_PREFIX, kvStorage), - // PrefixAppender.prefix(LEDGER_PRIVILEGE_PREFIX, versioningKVStorage), - // readonly); - - // this.participants = new ParticipantDataSet(metadata.getParticipantsHash(), - // previousSetting.getCryptoSetting(), - // PrefixAppender.prefix(LEDGER_PARTICIPANT_PREFIX, kvStorage), - // PrefixAppender.prefix(LEDGER_PARTICIPANT_PREFIX, versioningKVStorage), - // readonly); - String partiPrefix = keyPrefix + LEDGER_PARTICIPANT_PREFIX; - this.participants = new ParticipantDataSet(metadata.getParticipantsHash(), previousSetting.getCryptoSetting(), - partiPrefix, kvStorage, versioningKVStorage, readonly); - } - - private LedgerMetadata loadAndVerifySettings(HashDigest adminAccountHash) { - // String base58Hash = adminAccountHash.toBase58(); - // String key = encodeMetadataKey(base58Hash); - Bytes key = encodeMetadataKey(adminAccountHash); - byte[] bytes = settingsStorage.get(key); - HashFunction hashFunc = Crypto.getHashFunction(adminAccountHash.getAlgorithm()); - if (!hashFunc.verify(adminAccountHash, bytes)) { - LOGGER.error("The hash verification of ledger settings fail! --[HASH=" + key + "]"); - throw new LedgerException("The hash verification of ledger settings fail!"); - } - return deserializeMetadata(bytes); - } - - private Bytes encodeMetadataKey(HashDigest metadataHash) { - // return LEDGER_META_PREFIX + metadataHash; - // return metaPrefix + metadataHash; - return metaPrefix.concat(metadataHash); - } - - /* - * (non-Javadoc) - * - * @see com.jd.blockchain.ledger.core.LedgerAdministration#getMetadata() - */ - @Override - public LedgerMetadata getMetadata() { - return metadata; - } - - /** - * 返回原来的账本配置; - * - *
- * 此方法总是返回从上一个区块加载的账本配置,即时调用 {@link #setLedgerSetting(LedgerSetting)} 做出了新的更改; - * - * @return - */ - public LedgerSetting getPreviousSetting() { - return previousSetting; - } - - /** - * 返回当前设置的账本配置; - * - * @return - */ - public LedgerSetting getSetting() { - return metadata.getSetting(); - } - - /** - * 更新账本配置; - * - * @param ledgerSetting - */ - public void setLedgerSetting(LedgerSetting ledgerSetting) { - if (readonly) { - throw new IllegalArgumentException("This merkle dataset is readonly!"); - } - metadata.setSetting(ledgerSetting); - } - - @Override - public long getParticipantCount() { - return participants.getParticipantCount(); - } - - // /* - // * (non-Javadoc) - // * - // * @see - // * - // com.jd.blockchain.ledger.core.LedgerAdministration#getParticipant(java.lang. - // * String) - // */ - // @Override - // public ParticipantNode getParticipant(int id) { - // return participants.getParticipant(id); - // } - - @Override - public ParticipantNode[] getParticipants() { - return participants.getParticipants(); - } - - /** - * 加入新的参与方; 如果指定的参与方已经存在,则引发 LedgerException 异常; - * - * @param participant - */ - public void addParticipant(ParticipantNode participant) { - participants.addConsensusParticipant(participant); - } - - /** - * 更新参与方的状态参数; - * - * @param participant - */ - public void updateParticipant(ParticipantNode participant) { - participants.updateConsensusParticipant(participant); - } - - @Override - public boolean isUpdated() { - return updated || participants.isUpdated(); - } - - @Override - public void commit() { - if (!isUpdated()) { - return; - } - participants.commit(); - - metadata.setParticipantsHash(participants.getRootHash()); - - // 基于之前的密码配置来计算元数据的哈希; - byte[] metadataBytes = serializeMetadata(metadata); - HashFunction hashFunc = Crypto - .getHashFunction(previousSetting.getCryptoSetting().getHashAlgorithm()); - HashDigest metadataHash = hashFunc.hash(metadataBytes); - if (adminAccountHash == null || !adminAccountHash.equals(metadataHash)) { - // update modify; - // String base58MetadataHash = metadataHash.toBase58(); - // String metadataKey = encodeMetadataKey(base58MetadataHash); - Bytes metadataKey = encodeMetadataKey(metadataHash); - - boolean nx = settingsStorage.set(metadataKey, metadataBytes, ExPolicy.NOT_EXISTING); - if (!nx) { - // 有可能发生了并发写入冲突,不同的节点都向同一个存储服务器上写入数据; - // throw new LedgerException( - // "Ledger metadata already exist! --[LedgerMetadataHash=" + base58MetadataHash - // + "]"); - // LOGGER.warn("Ledger metadata already exist! --[MetadataHash=" + - // base58MetadataHash + "]"); - } - - adminAccountHash = metadataHash; - } - - updated = false; - } - - private LedgerMetadata deserializeMetadata(byte[] bytes) { - return BinaryProtocol.decode(bytes); - } - - private byte[] serializeMetadata(LedgerMetadataImpl config) { - return BinaryProtocol.encode(config, LedgerMetadata.class); - } - - @Override - public void cancel() { - if (!isUpdated()) { - return; - } - participants.cancel(); - metadata = new LedgerMetadataImpl(origMetadata); - } - - public static class LedgerMetadataImpl implements LedgerMetadata { - - private byte[] seed; - - private LedgerSetting setting; - - private HashDigest participantsHash; - - public LedgerMetadataImpl() { - } - - public LedgerMetadataImpl(LedgerMetadata metadata) { - this.seed = metadata.getSeed(); - this.setting = metadata.getSetting(); - this.participantsHash = metadata.getParticipantsHash(); - } - - @Override - public byte[] getSeed() { - return seed; - } - - @Override - public LedgerSetting getSetting() { - return setting; - } - - @Override - public HashDigest getParticipantsHash() { - return participantsHash; - } - - public void setSeed(byte[] seed) { - this.seed = seed; - } - - public void setSetting(LedgerSetting setting) { - // copy a new instance; - this.setting = new LedgerConfiguration(setting); - } - - public void setParticipantsHash(HashDigest participantsHash) { - this.participantsHash = participantsHash; - } - } - -} \ No newline at end of file diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java index c4961b12..9c794f82 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java @@ -268,6 +268,8 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, * * @return */ + + @Override public LedgerSettings getSettings() { return settings; } @@ -309,6 +311,16 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, participants.addConsensusParticipant(participant); } + + /** + * 更新参与方的状态参数; + * + * @param participant + */ + public void updateParticipant(ParticipantNode participant) { + participants.updateConsensusParticipant(participant); + } + @Override public boolean isUpdated() { return updated || participants.isUpdated() || rolePrivileges.isUpdated() || userRoles.isUpdated(); diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java index ece04036..434e8c4a 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java @@ -1,4 +1,4 @@ -package com.jd.blockchain.ledger.core.impl.handles; +package com.jd.blockchain.ledger.core.handles; import com.jd.blockchain.consensus.ConsensusProvider; import com.jd.blockchain.consensus.ConsensusProviders; @@ -6,66 +6,51 @@ import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.*; -import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import com.jd.blockchain.utils.Bytes; -public class ParticipantRegisterOperationHandle implements OperationHandle { - @Override - public BytesValue process(Operation op, LedgerDataSet dataset, TransactionRequestContext requestContext, - LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { - ParticipantRegisterOperation participantRegOp = (ParticipantRegisterOperation) op; +public class ParticipantRegisterOperationHandle extends AbstractLedgerOperationHandle { + public ParticipantRegisterOperationHandle() { + super(ParticipantRegisterOperation.class); + } - LedgerAdminAccount adminAccount = dataset.getAdminAccount(); + @Override + protected void doProcess(ParticipantRegisterOperation op, LedgerDataset newBlockDataset, + TransactionRequestExtension requestContext, LedgerDataQuery previousBlockDataset, + OperationHandleContext handleContext, LedgerService ledgerService) { - ParticipantInfo participantInfo = participantRegOp.getParticipantInfo(); + // 权限校验; + SecurityPolicy securityPolicy = SecurityContext.getContextUsersPolicy(); + securityPolicy.checkEndpointPermission(LedgerPermission.REGISTER_PARTICIPANT, MultiIDsPolicy.AT_LEAST_ONE); -// ConsensusProvider provider = ConsensusProviders.getProvider(adminAccount.getSetting().getConsensusProvider()); + ParticipantRegisterOperation participantRegOp = (ParticipantRegisterOperation) op; - ParticipantNode participantNode = new PartNode((int)(adminAccount.getParticipantCount()), participantInfo.getName(), participantInfo.getPubKey(), ParticipantNodeState.REGISTED); + LedgerAdminDataset adminAccountDataSet = newBlockDataset.getAdminDataset(); -// LedgerAdminAccount.LedgerMetadataImpl metadata = (LedgerAdminAccount.LedgerMetadataImpl) adminAccount.getMetadata(); + ParticipantInfo participantInfo = participantRegOp.getParticipantInfo(); + ParticipantNode participantNode = new PartNode((int)(adminAccountDataSet.getParticipantCount()), participantInfo.getName(), participantInfo.getPubKey(), ParticipantNodeState.REGISTED); PubKey pubKey = participantNode.getPubKey(); BlockchainIdentityData identityData = new BlockchainIdentityData(pubKey); - //update consensus setting -// Bytes newConsensusSettings = provider.getSettingsFactory().getConsensusSettingsBuilder().updateSettings(metadata.getSetting().getConsensusSetting(), participantInfo); - -// LedgerSetting ledgerSetting = new LedgerConfiguration(adminAccount.getSetting().getConsensusProvider(), -// newConsensusSettings, metadata.getSetting().getCryptoSetting()); - -// metadata.setSetting(ledgerSetting); -// metadata.setViewId(metadata.getViewId() + 1); - - - // //reg participant as user // dataset.getUserAccountSet().register(identityData.getAddress(), pubKey); //add new participant as consensus node - adminAccount.addParticipant(participantNode); - - // Build UserRegisterOperation; + adminAccountDataSet.addParticipant(participantNode); + + // Build UserRegisterOperation; UserRegisterOperation userRegOp = null;// handleContext.handle(userRegOp); - - - return null; - } - - @Override - public boolean support(Class operationType) { - return ParticipantRegisterOperation.class.isAssignableFrom(operationType); } private static class PartNode implements ParticipantNode { private int id; - private String address; + private Bytes address; private String name; @@ -77,7 +62,7 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { this.id = id; this.name = name; this.pubKey = pubKey; - this.address = AddressEncoding.generateAddress(pubKey).toBase58(); + this.address = AddressEncoding.generateAddress(pubKey); this.participantNodeState = participantNodeState; } @@ -87,7 +72,7 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { } @Override - public String getAddress() { + public Bytes getAddress() { return address; } @@ -107,4 +92,5 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { } } + } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java index 0976651f..0c4fe9af 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java @@ -1,4 +1,4 @@ -package com.jd.blockchain.ledger.core.impl.handles; +package com.jd.blockchain.ledger.core.handles; import com.jd.blockchain.consensus.ConsensusProvider; import com.jd.blockchain.consensus.ConsensusProviders; @@ -6,28 +6,30 @@ import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.*; -import com.jd.blockchain.ledger.core.impl.OperationHandleContext; import com.jd.blockchain.utils.Bytes; -public class ParticipantStateUpdateOperationHandle implements OperationHandle { - @Override - public boolean support(Class operationType) { - return ParticipantStateUpdateOperation.class.isAssignableFrom(operationType); +public class ParticipantStateUpdateOperationHandle extends AbstractLedgerOperationHandle { + public ParticipantStateUpdateOperationHandle() { + super(ParticipantStateUpdateOperation.class); } @Override - public BytesValue process(Operation op, LedgerDataSet newBlockDataset, TransactionRequestContext requestContext, LedgerDataSet previousBlockDataset, OperationHandleContext handleContext, LedgerService ledgerService) { + protected void doProcess(ParticipantStateUpdateOperation op, LedgerDataset newBlockDataset, + TransactionRequestExtension requestContext, LedgerDataQuery previousBlockDataset, + OperationHandleContext handleContext, LedgerService ledgerService) { - ParticipantStateUpdateOperation stateUpdateOperation = (ParticipantStateUpdateOperation) op; + // 权限校验; + SecurityPolicy securityPolicy = SecurityContext.getContextUsersPolicy(); + securityPolicy.checkEndpointPermission(LedgerPermission.REGISTER_PARTICIPANT, MultiIDsPolicy.AT_LEAST_ONE); - LedgerAdminAccount adminAccount = newBlockDataset.getAdminAccount(); + ParticipantStateUpdateOperation stateUpdateOperation = (ParticipantStateUpdateOperation) op; - ConsensusProvider provider = ConsensusProviders.getProvider(adminAccount.getSetting().getConsensusProvider()); + LedgerAdminDataset adminAccountDataSet = newBlockDataset.getAdminDataset(); - LedgerAdminAccount.LedgerMetadataImpl metadata = (LedgerAdminAccount.LedgerMetadataImpl) adminAccount.getMetadata(); + ConsensusProvider provider = ConsensusProviders.getProvider(adminAccountDataSet.getSettings().getConsensusProvider()); - ParticipantNode[] participants = adminAccount.getParticipants(); + ParticipantNode[] participants = adminAccountDataSet.getParticipants(); ParticipantNode participantNode = null; @@ -39,25 +41,24 @@ public class ParticipantStateUpdateOperationHandle implements OperationHandle { } //update consensus setting - ParticipantInfo participantInfo = new ParticipantInfoData("", participantNode.getName(), participantNode.getPubKey(), stateUpdateOperation.getStateUpdateInfo().getNetworkAddress()); + ParticipantInfo participantInfo = new ParticipantInfoData(participantNode.getName(), participantNode.getPubKey(), stateUpdateOperation.getStateUpdateInfo().getNetworkAddress()); - Bytes newConsensusSettings = provider.getSettingsFactory().getConsensusSettingsBuilder().updateSettings(metadata.getSetting().getConsensusSetting(), participantInfo); + Bytes newConsensusSettings = provider.getSettingsFactory().getConsensusSettingsBuilder().updateSettings(adminAccountDataSet.getSettings().getConsensusSetting(), participantInfo); - LedgerSetting ledgerSetting = new LedgerConfiguration(adminAccount.getSetting().getConsensusProvider(), - newConsensusSettings, metadata.getSetting().getCryptoSetting()); + LedgerSettings ledgerSetting = new LedgerConfiguration(adminAccountDataSet.getSettings().getConsensusProvider(), + newConsensusSettings, adminAccountDataSet.getPreviousSetting().getCryptoSetting()); - metadata.setSetting(ledgerSetting); + adminAccountDataSet.setLedgerSetting(ledgerSetting); - adminAccount.updateParticipant(participantNode); + adminAccountDataSet.updateParticipant(participantNode); - return null; } private static class PartNode implements ParticipantNode { private int id; - private String address; + private Bytes address; private String name; @@ -69,7 +70,7 @@ public class ParticipantStateUpdateOperationHandle implements OperationHandle { this.id = id; this.name = name; this.pubKey = pubKey; - this.address = AddressEncoding.generateAddress(pubKey).toBase58(); + this.address = AddressEncoding.generateAddress(pubKey); this.participantNodeState = participantNodeState; } @@ -79,7 +80,7 @@ public class ParticipantStateUpdateOperationHandle implements OperationHandle { } @Override - public String getAddress() { + public Bytes getAddress() { return address; } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java deleted file mode 100644 index fc888b29..00000000 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.jd.blockchain.ledger.core.impl; - -import java.util.ArrayList; -import java.util.List; - -import com.jd.blockchain.ledger.core.impl.handles.*; -import org.springframework.stereotype.Component; - -import com.jd.blockchain.ledger.LedgerException; -import com.jd.blockchain.ledger.core.OperationHandle; - -@Component -public class DefaultOperationHandleRegisteration implements OperationHandleRegisteration { - - private List opHandles = new ArrayList<>(); - - public DefaultOperationHandleRegisteration() { - initDefaultHandles(); - } - - /** - * 针对不采用bean依赖注入的方式来处理; - */ - private void initDefaultHandles() { - opHandles.add(new DataAccountKVSetOperationHandle()); - opHandles.add(new DataAccountRegisterOperationHandle()); - opHandles.add(new UserRegisterOperationHandle()); - opHandles.add(new ParticipantRegisterOperationHandle()); - opHandles.add(new ContractCodeDeployOperationHandle()); - opHandles.add(new JVMContractEventSendOperationHandle()); - opHandles.add(new ParticipantStateUpdateOperationHandle()); - } - - /** - * 以最高优先级插入一个操作处理器; - * - * @param handle - */ - public void insertAsTopPriority(OperationHandle handle) { - opHandles.remove(handle); - opHandles.add(0, handle); - } - - /* - * (non-Javadoc) - * - * @see - * com.jd.blockchain.ledger.core.impl.OperationHandleRegisteration#getHandle( - * java.lang.Class) - */ - @Override - public OperationHandle getHandle(Class operationType) { - for (OperationHandle handle : opHandles) { - if (handle.support(operationType)) { - return handle; - } - } - throw new LedgerException("Unsupported operation type[" + operationType.getName() + "]!"); - } - -} diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java index 07f6e1d0..c366fdd3 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java @@ -18,12 +18,12 @@ import com.jd.blockchain.utils.net.NetworkAddress; public interface ParticipantInfo { /** - * regist or unregist; + * regist or unregist, temporarily not available to users * * @return */ - @DataField(order = 0, primitiveType = PrimitiveType.TEXT) - String getFlag(); +// @DataField(order = 0, primitiveType = PrimitiveType.TEXT) +// String getFlag(); /** * 参与者名称; diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java index b41bb079..a5a6bc0a 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java @@ -18,24 +18,14 @@ public class ParticipantInfoData implements ParticipantInfo { private NetworkAddress networkAddress; - private String flag;//代表注册参与方或者删除参与方 +// private String flag;//代表注册参与方或者删除参与方 - public ParticipantInfoData(String flag, String name, PubKey pubKey, NetworkAddress networkAddress) { - this.flag = flag; + public ParticipantInfoData(String name, PubKey pubKey, NetworkAddress networkAddress) { this.name = name; this.pubKey = pubKey; this.networkAddress = networkAddress; } - @Override - public String getFlag() { - return flag; - } - - public void setFlag(String flag) { - this.flag = flag; - } - @Override public String getName() { return name; diff --git a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java index 460bdc9b..e4aea5a0 100644 --- a/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java +++ b/source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java @@ -10,27 +10,13 @@ package com.jd.blockchain.sdk.converters; import java.lang.reflect.Field; +import com.jd.blockchain.ledger.*; import org.apache.commons.codec.binary.Base64; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.jd.blockchain.crypto.CryptoProvider; import com.jd.blockchain.crypto.PubKey; -import com.jd.blockchain.ledger.BlockchainIdentityData; -import com.jd.blockchain.ledger.BytesData; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.BytesValueEncoding; -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.DataType; -import com.jd.blockchain.ledger.KVDataEntry; -import com.jd.blockchain.ledger.LedgerInitOperation; -import com.jd.blockchain.ledger.Operation; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.ledger.UserRegisterOperation; import com.jd.blockchain.transaction.ContractCodeDeployOpTemplate; import com.jd.blockchain.transaction.ContractEventSendOpTemplate; import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; @@ -214,8 +200,7 @@ public class ClientResolveUtil { JSONObject pubKeyObj = currConsensusParticipant.getJSONObject("pubKey"); String pubKeyBase58 = pubKeyObj.getString("value"); // 生成ParticipantNode对象 - ParticipantCertData participantCertData = new ParticipantCertData(id, addressBase58, name, new PubKey(Bytes.fromBase58(pubKeyBase58).toBytes())); - new PubKey(Bytes.fromBase58(pubKeyBase58).toBytes())); + ParticipantCertData participantCertData = new ParticipantCertData(id, address, name, new PubKey(Bytes.fromBase58(pubKeyBase58).toBytes())); participantNodes[i] = participantCertData; } ledgerInitSettingData.setConsensusParticipants(participantNodes); @@ -309,7 +294,7 @@ public class ClientResolveUtil { this.pubKey = participantNode.getPubKey(); } - public ParticipantCertData(int id, String address, String name, PubKey pubKey) { + public ParticipantCertData(int id, Bytes address, String name, PubKey pubKey) { this.id = id; this.address = address; this.name = name; @@ -332,14 +317,11 @@ public class ClientResolveUtil { return pubKey; } + @Override public int getId() { return id; } - public void setId(int id) { - this.id = id; - } - @Override public ParticipantNodeState getParticipantNodeState() { return participantNodeState; diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java index ec523269..f0bd032e 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java @@ -72,9 +72,9 @@ public class SDK_GateWay_Participant_Regist_Test_ { //existed signer AsymmetricKeypair keyPair = new BlockchainKeypair(pubKey, privKey); - PrivKey privKey = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); + PrivKey privKey = KeyGenUtils.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); - PubKey pubKey = KeyGenCommand.decodePubKey(PUB); + PubKey pubKey = KeyGenUtils.decodePubKey(PUB); System.out.println("Address = "+AddressEncoding.generateAddress(pubKey)); @@ -82,7 +82,7 @@ public class SDK_GateWay_Participant_Regist_Test_ { NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); - ParticipantInfo participantInfo = new ParticipantInfoData("add","Peer4", user.getPubKey(), networkAddress); + ParticipantInfo participantInfo = new ParticipantInfoData("Peer4", user.getPubKey(), networkAddress); // 注册参与方 txTemp.participants().register(participantInfo); diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java index ea04ef69..ab2468be 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java @@ -71,9 +71,9 @@ public class SDK_GateWay_Participant_State_Update_Test_ { //existed signer AsymmetricKeypair keyPair = new BlockchainKeypair(pubKey, privKey); - PrivKey privKey = KeyGenCommand.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); + PrivKey privKey = KeyGenUtils.decodePrivKeyWithRawPassword(PRIV, SDKDemo_Constant.PASSWORD); - PubKey pubKey = KeyGenCommand.decodePubKey(PUB); + PubKey pubKey = KeyGenUtils.decodePubKey(PUB); System.out.println("Address = "+AddressEncoding.generateAddress(pubKey)); diff --git a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java index 663cef6d..1f666572 100644 --- a/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java +++ b/source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java @@ -88,7 +88,7 @@ public class Utils { public static ParticipantNode[] loadParticipantNodes() { ParticipantNode[] participantNodes = new ParticipantNode[PUB_KEYS.length]; for (int i = 0; i < PUB_KEYS.length; i++) { - participantNodes[i] = new PartNode(i, KeyGenCommand.decodePubKey(PUB_KEYS[i])); + participantNodes[i] = new PartNode(i, KeyGenUtils.decodePubKey(PUB_KEYS[i]), ParticipantNodeState.CONSENSUSED); } return participantNodes; } diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java index b4550ee5..f8a7cfed 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java @@ -175,7 +175,7 @@ public class IntegrationBase { // 定义交易; TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); - ParticipantInfoData participantInfoData = new ParticipantInfoData("add", "peer4", participant.getPubKey(), new NetworkAddress("127.0.0.1", 20000)); + ParticipantInfoData participantInfoData = new ParticipantInfoData("peer4", participant.getPubKey(), new NetworkAddress("127.0.0.1", 20000)); txTpl.participants().register(participantInfoData); @@ -201,7 +201,7 @@ public class IntegrationBase { // 定义交易; TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); - ParticipantInfoData participantInfoData = new ParticipantInfoData("add", "peer4", participantKeyPair.getPubKey(), new NetworkAddress("127.0.0.1", 20000)); + ParticipantInfoData participantInfoData = new ParticipantInfoData("peer4", participantKeyPair.getPubKey(), new NetworkAddress("127.0.0.1", 20000)); ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(participantKeyPair.getPubKey(), ParticipantNodeState.CONSENSUSED, participantInfoData.getNetworkAddress()); diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java index ec352082..20a841a4 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java @@ -151,7 +151,7 @@ public class IntegrationTest4Bftsmart { } } - long participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); + long participantCount = ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); long userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); @@ -162,28 +162,28 @@ public class IntegrationTest4Bftsmart { participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); } - participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); + participantCount = ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); - BftsmartConsensusSettings consensusSettings = (BftsmartConsensusSettings) ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminAccount().getSetting().getConsensusSetting().toBytes()); + BftsmartConsensusSettings consensusSettings = (BftsmartConsensusSettings) ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminInfo().getSettings().getConsensusSetting().toBytes()); System.out.printf("update participant state before ,old consensus env node num = %d\r\n", consensusSettings.getNodes().length); for (int i = 0; i < participantCount; i++) { - System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); + System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); } if (isParticipantStateUpdate) { IntegrationBase.testSDK_UpdateParticipantState(adminKey, new BlockchainKeypair(participantResponse.getKeyPair().getPubKey(), participantResponse.getKeyPair().getPrivKey()), ledgerHash, blockchainService); } - BftsmartConsensusSettings consensusSettingsNew = (BftsmartConsensusSettings) ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getSetting().getConsensusSetting().toBytes()); + BftsmartConsensusSettings consensusSettingsNew = (BftsmartConsensusSettings) ConsensusProviders.getProvider(BFTSMART_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getSettings().getConsensusSetting().toBytes()); System.out.printf("update participant state after ,new consensus env node num = %d\r\n", consensusSettingsNew.getNodes().length); for (int i = 0; i < participantCount; i++) { - System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); + System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); } try { diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java index dedb4738..c018a855 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java @@ -147,7 +147,7 @@ public class IntegrationTest4MQ { integrationBase.testSDK_Contract(adminKey, ledgerHash, blockchainService,ledgerRepository); } - long participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); + long participantCount = ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); long userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); @@ -158,30 +158,30 @@ public class IntegrationTest4MQ { participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); } - participantCount = ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); + participantCount = ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getParticipantCount(); userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); System.out.printf("after add participant: participantCount = %d, userCount = %d\r\n", (int)participantCount, (int)userCount); - MsgQueueConsensusSettings consensusSettings = (MsgQueueConsensusSettings) ConsensusProviders.getProvider(MQ_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminAccount().getSetting().getConsensusSetting().toBytes()); + MsgQueueConsensusSettings consensusSettings = (MsgQueueConsensusSettings) ConsensusProviders.getProvider(MQ_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminInfo().getSettings().getConsensusSetting().toBytes()); System.out.printf("update participant state before ,old consensus env node num = %d\r\n", consensusSettings.getNodes().length); for (int i = 0; i < participantCount; i++) { - System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); + System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); } if (isParticipantStateUpdate) { IntegrationBase.testSDK_UpdateParticipantState(adminKey, new BlockchainKeypair(participantResponse.getKeyPair().getPubKey(), participantResponse.getKeyPair().getPrivKey()), ledgerHash, blockchainService); } - BftsmartConsensusSettings consensusSettingsNew = (BftsmartConsensusSettings) ConsensusProviders.getProvider(MQ_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getSetting().getConsensusSetting().toBytes()); + BftsmartConsensusSettings consensusSettingsNew = (BftsmartConsensusSettings) ConsensusProviders.getProvider(MQ_PROVIDER).getSettingsFactory().getConsensusSettingsEncoder().decode(ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getSettings().getConsensusSetting().toBytes()); System.out.printf("update participant state after ,new consensus env node num = %d\r\n", consensusSettingsNew.getNodes().length); for (int i = 0; i < participantCount; i++) { - System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminAccount(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); + System.out.printf("part%d state = %d\r\n",i, ledgerRepository.getAdminInfo(ledgerRepository.retrieveLatestBlock()).getParticipants()[i].getParticipantNodeState().CODE); } IntegrationBase.testConsistencyAmongNodes(ledgers); From 299a5b3b524735dd79d293331d0715782407e08d Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Tue, 10 Sep 2019 14:41:59 +0800 Subject: [PATCH 14/15] the second revision of the code merger --- .../ParticipantRegisterOperationHandle.java | 16 +++------- ...ParticipantStateUpdateOperationHandle.java | 4 +-- .../ledger/ParticipantInfoData.java | 1 + .../ledger/ParticipantRegisterOperation.java | 11 +++++-- .../ParticipantStateUpdateOperation.java | 14 +++++++-- .../BlockchainOperationFactory.java | 10 ++++--- .../transaction/ClientOperator.java | 2 +- .../transaction/ParticipantOperator.java | 7 +++++ .../ParticipantRegisterOpTemplate.java | 27 +++++++++++++---- .../ParticipantRegisterOperationBuilder.java | 5 +++- ...rticipantRegisterOperationBuilderImpl.java | 7 +++-- .../ParticipantStateUpdateOpTemplate.java | 30 +++++++++++++++---- ...articipantStateUpdateOperationBuilder.java | 5 +++- ...cipantStateUpdateOperationBuilderImpl.java | 7 +++-- .../SDK_GateWay_Participant_Regist_Test_.java | 4 +-- ...ateWay_Participant_State_Update_Test_.java | 5 ++-- .../jd/blockchain/intgr/IntegrationBase.java | 8 ++--- 17 files changed, 112 insertions(+), 51 deletions(-) diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java index 434e8c4a..6f783680 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java @@ -1,11 +1,10 @@ package com.jd.blockchain.ledger.core.handles; -import com.jd.blockchain.consensus.ConsensusProvider; -import com.jd.blockchain.consensus.ConsensusProviders; import com.jd.blockchain.crypto.AddressEncoding; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.*; +import com.jd.blockchain.transaction.UserRegisterOpTemplate; import com.jd.blockchain.utils.Bytes; @@ -27,22 +26,15 @@ public class ParticipantRegisterOperationHandle extends AbstractLedgerOperationH LedgerAdminDataset adminAccountDataSet = newBlockDataset.getAdminDataset(); - ParticipantInfo participantInfo = participantRegOp.getParticipantInfo(); + ParticipantInfo participantInfo = new ParticipantInfoData(participantRegOp.getParticipantName(), participantRegOp.getParticipantIdentity().getPubKey(), participantRegOp.getNetworkAddress()); ParticipantNode participantNode = new PartNode((int)(adminAccountDataSet.getParticipantCount()), participantInfo.getName(), participantInfo.getPubKey(), ParticipantNodeState.REGISTED); - PubKey pubKey = participantNode.getPubKey(); - - BlockchainIdentityData identityData = new BlockchainIdentityData(pubKey); - -// //reg participant as user -// dataset.getUserAccountSet().register(identityData.getAddress(), pubKey); - //add new participant as consensus node adminAccountDataSet.addParticipant(participantNode); - // Build UserRegisterOperation; - UserRegisterOperation userRegOp = null;// + // Build UserRegisterOperation, reg participant as user + UserRegisterOperation userRegOp = new UserRegisterOpTemplate(participantRegOp.getParticipantIdentity()); handleContext.handle(userRegOp); } diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java index 0c4fe9af..8969cfea 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java @@ -34,14 +34,14 @@ public class ParticipantStateUpdateOperationHandle extends AbstractLedgerOperati ParticipantNode participantNode = null; for(int i = 0; i < participants.length; i++) { - if (stateUpdateOperation.getStateUpdateInfo().getPubKey().equals(participants[i].getPubKey())) { + if (stateUpdateOperation.getParticipantIdentity().getPubKey().equals(participants[i].getPubKey())) { participantNode = new PartNode(participants[i].getId(), participants[i].getName(), participants[i].getPubKey(), ParticipantNodeState.CONSENSUSED); break; } } //update consensus setting - ParticipantInfo participantInfo = new ParticipantInfoData(participantNode.getName(), participantNode.getPubKey(), stateUpdateOperation.getStateUpdateInfo().getNetworkAddress()); + ParticipantInfo participantInfo = new ParticipantInfoData(participantNode.getName(), participantNode.getPubKey(), stateUpdateOperation.getNetworkAddress()); Bytes newConsensusSettings = provider.getSettingsFactory().getConsensusSettingsBuilder().updateSettings(adminAccountDataSet.getSettings().getConsensusSetting(), participantInfo); diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java index a5a6bc0a..27eaa098 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java @@ -2,6 +2,7 @@ package com.jd.blockchain.ledger; import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.utils.net.NetworkAddress; +import org.omg.CORBA.PUBLIC_MEMBER; /** * 即将要注册的参与方的信息 diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantRegisterOperation.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantRegisterOperation.java index 2762e924..a8ccf227 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantRegisterOperation.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantRegisterOperation.java @@ -2,12 +2,19 @@ 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.net.NetworkAddress; @DataContract(code= DataCodes.TX_OP_PARTICIPANT_REG) public interface ParticipantRegisterOperation extends Operation { - @DataField(order=1, refContract = true) - ParticipantInfo getParticipantInfo(); + @DataField(order = 0, primitiveType=PrimitiveType.TEXT) + String getParticipantName(); + @DataField(order = 1, refContract = true) + BlockchainIdentity getParticipantIdentity(); + + @DataField(order = 2, primitiveType = PrimitiveType.BYTES) + NetworkAddress getNetworkAddress(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateOperation.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateOperation.java index 1f656609..46cfea0e 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateOperation.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantStateUpdateOperation.java @@ -2,10 +2,20 @@ 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.net.NetworkAddress; @DataContract(code= DataCodes.TX_OP_PARTICIPANT_STATE_UPDATE) public interface ParticipantStateUpdateOperation extends Operation { - @DataField(order=1, refContract = true) - ParticipantStateUpdateInfo getStateUpdateInfo(); + + @DataField(order = 0, refContract = true) + BlockchainIdentity getParticipantIdentity(); + + @DataField(order = 1, primitiveType = PrimitiveType.BYTES) + NetworkAddress getNetworkAddress(); + + @DataField(order = 2, refEnum = true) + ParticipantNodeState getState(); + } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java index 317b6e85..c08cc0cb 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/BlockchainOperationFactory.java @@ -4,8 +4,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import com.jd.blockchain.crypto.PubKey; import com.jd.blockchain.ledger.*; import com.jd.blockchain.utils.Bytes; +import com.jd.blockchain.utils.net.NetworkAddress; /** * @author huanghaiquan @@ -288,8 +290,8 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe private class ParticipantRegisterOperationBuilderFilter implements ParticipantRegisterOperationBuilder { @Override - public ParticipantRegisterOperation register(ParticipantInfo participantInfo) { - ParticipantRegisterOperation op = PARTICIPANT_REG_OP_BUILDER.register(participantInfo); + public ParticipantRegisterOperation register(String participantName, BlockchainIdentity participantIdentity, NetworkAddress networkAddress) { + ParticipantRegisterOperation op = PARTICIPANT_REG_OP_BUILDER.register(participantName, participantIdentity, networkAddress); operationList.add(op); return op; } @@ -297,8 +299,8 @@ public class BlockchainOperationFactory implements ClientOperator, LedgerInitOpe private class ParticipantStateUpdateOperationBuilderFilter implements ParticipantStateUpdateOperationBuilder { @Override - public ParticipantStateUpdateOperation update(ParticipantStateUpdateInfo stateUpdateInfo) { - ParticipantStateUpdateOperation op = PARTICIPANT_STATE_UPDATE_OP_BUILDER.update(stateUpdateInfo); + public ParticipantStateUpdateOperation update(BlockchainIdentity blockchainIdentity, NetworkAddress networkAddress, ParticipantNodeState participantNodeState) { + ParticipantStateUpdateOperation op = PARTICIPANT_STATE_UPDATE_OP_BUILDER.update(blockchainIdentity, networkAddress, participantNodeState); operationList.add(op); return op; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java index 724e8d8a..cba4569e 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ClientOperator.java @@ -7,6 +7,6 @@ package com.jd.blockchain.transaction; * */ public interface ClientOperator - extends SecurityOperator, UserOperator, DataAccountOperator, ContractOperator, EventOperator, ParticipantOperator, ParticipantStateOperator { + extends SecurityOperator, UserOperator, DataAccountOperator, ContractOperator, EventOperator, ParticipantOperator { } \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantOperator.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantOperator.java index 94237cc3..83c1524a 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantOperator.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantOperator.java @@ -8,4 +8,11 @@ public interface ParticipantOperator { * @return */ ParticipantRegisterOperationBuilder participants(); + + /** + * 参与方状态更新操作; + * + * @return + */ + ParticipantStateUpdateOperationBuilder states(); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOpTemplate.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOpTemplate.java index 3eeaea53..2b5c608d 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOpTemplate.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOpTemplate.java @@ -1,8 +1,11 @@ package com.jd.blockchain.transaction; import com.jd.blockchain.binaryproto.DataContractRegistry; +import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.ledger.BlockchainIdentity; import com.jd.blockchain.ledger.ParticipantInfo; import com.jd.blockchain.ledger.ParticipantRegisterOperation; +import com.jd.blockchain.utils.net.NetworkAddress; public class ParticipantRegisterOpTemplate implements ParticipantRegisterOperation { @@ -10,15 +13,29 @@ public class ParticipantRegisterOpTemplate implements ParticipantRegisterOperati DataContractRegistry.register(ParticipantRegisterOperation.class); } - private ParticipantInfo participantInfo; + private String participantName; + private BlockchainIdentity participantPubKey; + private NetworkAddress networkAddress; - public ParticipantRegisterOpTemplate(ParticipantInfo participantInfo) { + public ParticipantRegisterOpTemplate(String participantName, BlockchainIdentity participantPubKey, NetworkAddress networkAddress) { + this.participantName = participantName; + this.participantPubKey = participantPubKey; + this.networkAddress = networkAddress; - this.participantInfo = participantInfo; } @Override - public ParticipantInfo getParticipantInfo() { - return participantInfo; + public String getParticipantName() { + return participantName; + } + + @Override + public BlockchainIdentity getParticipantIdentity() { + return participantPubKey; + } + + @Override + public NetworkAddress getNetworkAddress() { + return networkAddress; } } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilder.java index 3776b691..26f54c5b 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilder.java @@ -1,7 +1,10 @@ package com.jd.blockchain.transaction; +import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.ledger.BlockchainIdentity; import com.jd.blockchain.ledger.ParticipantInfo; import com.jd.blockchain.ledger.ParticipantRegisterOperation; +import com.jd.blockchain.utils.net.NetworkAddress; public interface ParticipantRegisterOperationBuilder { @@ -14,7 +17,7 @@ public interface ParticipantRegisterOperationBuilder { * * @return */ - ParticipantRegisterOperation register(ParticipantInfo participantInfo); + ParticipantRegisterOperation register(String participantName, BlockchainIdentity participantPubKey, NetworkAddress networkAddress); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilderImpl.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilderImpl.java index 56339bfa..34b126d1 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilderImpl.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantRegisterOperationBuilderImpl.java @@ -1,11 +1,14 @@ package com.jd.blockchain.transaction; +import com.jd.blockchain.crypto.PubKey; +import com.jd.blockchain.ledger.BlockchainIdentity; import com.jd.blockchain.ledger.ParticipantInfo; import com.jd.blockchain.ledger.ParticipantRegisterOperation; +import com.jd.blockchain.utils.net.NetworkAddress; public class ParticipantRegisterOperationBuilderImpl implements ParticipantRegisterOperationBuilder { @Override - public ParticipantRegisterOperation register(ParticipantInfo participantNode) { - return new ParticipantRegisterOpTemplate(participantNode); + public ParticipantRegisterOperation register(String participantName, BlockchainIdentity participantPubKey, NetworkAddress networkAddress) { + return new ParticipantRegisterOpTemplate(participantName, participantPubKey, networkAddress); } } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOpTemplate.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOpTemplate.java index 9a410a1e..abb3b28d 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOpTemplate.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOpTemplate.java @@ -1,8 +1,10 @@ package com.jd.blockchain.transaction; import com.jd.blockchain.binaryproto.DataContractRegistry; -import com.jd.blockchain.ledger.ParticipantStateUpdateInfo; +import com.jd.blockchain.ledger.BlockchainIdentity; +import com.jd.blockchain.ledger.ParticipantNodeState; import com.jd.blockchain.ledger.ParticipantStateUpdateOperation; +import com.jd.blockchain.utils.net.NetworkAddress; public class ParticipantStateUpdateOpTemplate implements ParticipantStateUpdateOperation { @@ -10,14 +12,30 @@ public class ParticipantStateUpdateOpTemplate implements ParticipantStateUpdateO DataContractRegistry.register(ParticipantStateUpdateOperation.class); } - private ParticipantStateUpdateInfo stateUpdateInfo; + private BlockchainIdentity blockchainIdentity; + private NetworkAddress networkAddress; + private ParticipantNodeState participantNodeState; - public ParticipantStateUpdateOpTemplate(ParticipantStateUpdateInfo stateUpdateInfo) { - this.stateUpdateInfo = stateUpdateInfo; + public ParticipantStateUpdateOpTemplate(BlockchainIdentity blockchainIdentity, NetworkAddress networkAddress, ParticipantNodeState participantNodeState) { + + this.blockchainIdentity = blockchainIdentity; + this.networkAddress = networkAddress; + this.participantNodeState = participantNodeState; + } + + + @Override + public BlockchainIdentity getParticipantIdentity() { + return blockchainIdentity; + } + + @Override + public NetworkAddress getNetworkAddress() { + return networkAddress; } @Override - public ParticipantStateUpdateInfo getStateUpdateInfo() { - return stateUpdateInfo; + public ParticipantNodeState getState() { + return participantNodeState; } } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilder.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilder.java index afb66bff..d6c69dc3 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilder.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilder.java @@ -1,7 +1,10 @@ package com.jd.blockchain.transaction; +import com.jd.blockchain.ledger.BlockchainIdentity; +import com.jd.blockchain.ledger.ParticipantNodeState; import com.jd.blockchain.ledger.ParticipantStateUpdateInfo; import com.jd.blockchain.ledger.ParticipantStateUpdateOperation; +import com.jd.blockchain.utils.net.NetworkAddress; public interface ParticipantStateUpdateOperationBuilder { @@ -14,5 +17,5 @@ public interface ParticipantStateUpdateOperationBuilder { * * @return */ - ParticipantStateUpdateOperation update(ParticipantStateUpdateInfo stateUpdateInfo); + ParticipantStateUpdateOperation update(BlockchainIdentity blockchainIdentity, NetworkAddress networkAddress, ParticipantNodeState participantNodeState); } \ No newline at end of file diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilderImpl.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilderImpl.java index 7c579fd7..9c84e181 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilderImpl.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ParticipantStateUpdateOperationBuilderImpl.java @@ -1,12 +1,15 @@ package com.jd.blockchain.transaction; +import com.jd.blockchain.ledger.BlockchainIdentity; +import com.jd.blockchain.ledger.ParticipantNodeState; import com.jd.blockchain.ledger.ParticipantStateUpdateInfo; import com.jd.blockchain.ledger.ParticipantStateUpdateOperation; +import com.jd.blockchain.utils.net.NetworkAddress; public class ParticipantStateUpdateOperationBuilderImpl implements ParticipantStateUpdateOperationBuilder { @Override - public ParticipantStateUpdateOperation update(ParticipantStateUpdateInfo stateUpdateInfo) { - return new ParticipantStateUpdateOpTemplate(stateUpdateInfo); + public ParticipantStateUpdateOperation update(BlockchainIdentity blockchainIdentity, NetworkAddress networkAddress, ParticipantNodeState participantNodeState) { + return new ParticipantStateUpdateOpTemplate(blockchainIdentity, networkAddress, participantNodeState); } } diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java index f0bd032e..77157f0d 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java @@ -82,10 +82,8 @@ public class SDK_GateWay_Participant_Regist_Test_ { NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); - ParticipantInfo participantInfo = new ParticipantInfoData("Peer4", user.getPubKey(), networkAddress); - // 注册参与方 - txTemp.participants().register(participantInfo); + txTemp.participants().register("Peer4", user.getIdentity(), networkAddress); // TX 准备就绪; PreparedTransaction prepTx = txTemp.prepare(); diff --git a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java index ab2468be..9a51657a 100644 --- a/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java +++ b/source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java @@ -77,10 +77,11 @@ public class SDK_GateWay_Participant_State_Update_Test_ { System.out.println("Address = "+AddressEncoding.generateAddress(pubKey)); + BlockchainKeypair user = new BlockchainKeypair(pubKey, privKey); + NetworkAddress networkAddress = new NetworkAddress("127.0.0.1", 20000); - ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(pubKey, ParticipantNodeState.CONSENSUSED, networkAddress); - txTemp.states().update(stateUpdateInfo); + txTemp.states().update(user.getIdentity(),networkAddress, ParticipantNodeState.CONSENSUSED); // TX 准备就绪; PreparedTransaction prepTx = txTemp.prepare(); diff --git a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java index f8a7cfed..04c67892 100644 --- a/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java +++ b/source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java @@ -175,9 +175,7 @@ public class IntegrationBase { // 定义交易; TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); - ParticipantInfoData participantInfoData = new ParticipantInfoData("peer4", participant.getPubKey(), new NetworkAddress("127.0.0.1", 20000)); - - txTpl.participants().register(participantInfoData); + txTpl.participants().register("peer4", new BlockchainIdentityData(participant.getPubKey()), new NetworkAddress("127.0.0.1", 20000)); // 签名; PreparedTransaction ptx = txTpl.prepare(); @@ -203,9 +201,7 @@ public class IntegrationBase { ParticipantInfoData participantInfoData = new ParticipantInfoData("peer4", participantKeyPair.getPubKey(), new NetworkAddress("127.0.0.1", 20000)); - ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(participantKeyPair.getPubKey(), ParticipantNodeState.CONSENSUSED, participantInfoData.getNetworkAddress()); - - txTpl.states().update(stateUpdateInfo); + txTpl.states().update(new BlockchainIdentityData(participantInfoData.getPubKey()), participantInfoData.getNetworkAddress(), ParticipantNodeState.CONSENSUSED); // 签名; PreparedTransaction ptx = txTpl.prepare(); From 0bcc74e15f5639d31c81e08285ade3df7f76bd71 Mon Sep 17 00:00:00 2001 From: zhangshuang Date: Tue, 10 Sep 2019 16:37:54 +0800 Subject: [PATCH 15/15] solve compile problem --- .../com/jd/blockchain/consts/DataCodes.java | 8 +++--- .../ledger/core/ParticipantCertData.java | 4 ++- .../ledger/core/ContractInvokingTest.java | 25 +++---------------- .../ledger/core/LedgerAdminDatasetTest.java | 15 ++--------- .../ledger/core/LedgerInitOperationTest.java | 8 +++--- .../core/LedgerInitSettingSerializeTest.java | 4 ++- .../ledger/core/LedgerManagerTest.java | 5 ++++ .../ledger/core/LedgerMetaDataTest.java | 7 ++---- .../ledger/core/LedgerTestUtils.java | 9 ++----- .../ledger/LedgerInitProperties.java | 4 +++ .../transaction/ConsensusParticipantData.java | 8 ++++-- 11 files changed, 38 insertions(+), 59 deletions(-) diff --git a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java index 26b52692..607c051d 100644 --- a/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java +++ b/source/base/src/main/java/com/jd/blockchain/consts/DataCodes.java @@ -58,13 +58,13 @@ public interface DataCodes { public static final int TX_OP_RESULT = 0x370; - public static final int TX_OP_ROLE_CONFIGURE = 0x370; + public static final int TX_OP_ROLE_CONFIGURE = 0x371; - public static final int TX_OP_ROLE_CONFIGURE_ENTRY = 0x371; + public static final int TX_OP_ROLE_CONFIGURE_ENTRY = 0x372; - public static final int TX_OP_USER_ROLES_AUTHORIZE = 0x372; + public static final int TX_OP_USER_ROLES_AUTHORIZE = 0x373; - public static final int TX_OP_USER_ROLE_AUTHORIZE_ENTRY = 0x373; + public static final int TX_OP_USER_ROLE_AUTHORIZE_ENTRY = 0x374; // enum types of permissions; public static final int ENUM_TX_PERMISSION = 0x401; diff --git a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java index 45078129..c9212bb2 100644 --- a/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java +++ b/source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/ParticipantCertData.java @@ -30,10 +30,11 @@ public class ParticipantCertData implements ParticipantNode { this.participantNodeState = participantNode.getParticipantNodeState(); } - public ParticipantCertData(Bytes address, String name, PubKey pubKey) { + public ParticipantCertData(Bytes address, String name, PubKey pubKey, ParticipantNodeState participantNodeState) { this.address = address; this.name = name; this.pubKey = pubKey; + this.participantNodeState = participantNodeState; } @Override @@ -51,6 +52,7 @@ public class ParticipantCertData implements ParticipantNode { return pubKey; } + @Override public int getId() { return id; } diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java index c05c3f1b..77cf7024 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/ContractInvokingTest.java @@ -15,33 +15,13 @@ import static org.mockito.Mockito.when; import java.util.Random; +import com.jd.blockchain.ledger.*; import org.junit.Test; import org.mockito.Mockito; import com.jd.blockchain.binaryproto.BinaryProtocol; import com.jd.blockchain.binaryproto.DataContractRegistry; import com.jd.blockchain.crypto.HashDigest; -import com.jd.blockchain.ledger.BlockchainKeyGenerator; -import com.jd.blockchain.ledger.BlockchainKeypair; -import com.jd.blockchain.ledger.BytesData; -import com.jd.blockchain.ledger.BytesValue; -import com.jd.blockchain.ledger.DataAccountRegisterOperation; -import com.jd.blockchain.ledger.EndpointRequest; -import com.jd.blockchain.ledger.KVDataEntry; -import com.jd.blockchain.ledger.LedgerBlock; -import com.jd.blockchain.ledger.LedgerInitSetting; -import com.jd.blockchain.ledger.LedgerPermission; -import com.jd.blockchain.ledger.LedgerTransaction; -import com.jd.blockchain.ledger.NodeRequest; -import com.jd.blockchain.ledger.OperationResult; -import com.jd.blockchain.ledger.TransactionContent; -import com.jd.blockchain.ledger.TransactionContentBody; -import com.jd.blockchain.ledger.TransactionPermission; -import com.jd.blockchain.ledger.TransactionRequest; -import com.jd.blockchain.ledger.TransactionRequestBuilder; -import com.jd.blockchain.ledger.TransactionResponse; -import com.jd.blockchain.ledger.TransactionState; -import com.jd.blockchain.ledger.UserRegisterOperation; import com.jd.blockchain.ledger.core.DefaultOperationHandleRegisteration; import com.jd.blockchain.ledger.core.LedgerDataQuery; import com.jd.blockchain.ledger.core.LedgerDataset; @@ -75,6 +55,9 @@ public class ContractInvokingTest { DataContractRegistry.register(TransactionResponse.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); + DataContractRegistry.register(ParticipantNode.class); + DataContractRegistry.register(ParticipantRegisterOperation.class); + DataContractRegistry.register(ParticipantStateUpdateOperation.class); } private static final String LEDGER_KEY_PREFIX = "LDG://"; diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerAdminDatasetTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerAdminDatasetTest.java index e591aa7f..c8ec5e93 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerAdminDatasetTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerAdminDatasetTest.java @@ -10,6 +10,7 @@ import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Random; +import com.jd.blockchain.ledger.*; import org.junit.Test; import com.jd.blockchain.crypto.AddressEncoding; @@ -19,19 +20,6 @@ import com.jd.blockchain.crypto.HashDigest; 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.BlockchainKeypair; -import com.jd.blockchain.ledger.LedgerAdminInfo; -import com.jd.blockchain.ledger.LedgerMetadata_V2; -import com.jd.blockchain.ledger.LedgerPermission; -import com.jd.blockchain.ledger.LedgerSettings; -import com.jd.blockchain.ledger.ParticipantNode; -import com.jd.blockchain.ledger.RolePrivilegeSettings; -import com.jd.blockchain.ledger.RolePrivileges; -import com.jd.blockchain.ledger.RolesPolicy; -import com.jd.blockchain.ledger.TransactionPermission; -import com.jd.blockchain.ledger.UserRolesSettings; -import com.jd.blockchain.ledger.UserRoles; import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.LedgerAdminDataset; import com.jd.blockchain.ledger.core.LedgerConfiguration; @@ -62,6 +50,7 @@ public class LedgerAdminDatasetTest { parties[i].setHostAddress(new NetworkAddress("192.168.10." + (10 + i), 10010 + 10 * i)); parties[i].setName("Participant[" + i + "]"); parties[i].setPubKey(bckeys[i].getPubKey()); + parties[i].setParticipantState(ParticipantNodeState.CONSENSUSED); } ConsensusParticipantData[] parties1 = Arrays.copyOf(parties, 4); initSetting.setConsensusParticipants(parties1); diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitOperationTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitOperationTest.java index 8c245fa2..e3c36a73 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitOperationTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitOperationTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.Random; +import com.jd.blockchain.ledger.*; import org.junit.Before; import org.junit.Test; @@ -17,10 +18,6 @@ import com.jd.blockchain.crypto.CryptoProvider; 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.BlockchainKeypair; -import com.jd.blockchain.ledger.LedgerInitOperation; -import com.jd.blockchain.ledger.LedgerInitSetting; import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.ParticipantCertData; import com.jd.blockchain.transaction.ConsensusParticipantData; @@ -80,6 +77,7 @@ public class LedgerInitOperationTest { parties[i].setHostAddress(new NetworkAddress("192.168.10." + (10 + i), 10010 + 10 * i)); parties[i].setName("Participant[" + i + "]"); parties[i].setPubKey(keys[i].getPubKey()); + parties[i].setParticipantState(ParticipantNodeState.CONSENSUSED); } ConsensusParticipantData[] parties1 = Arrays.copyOf(parties, 4); @@ -118,7 +116,7 @@ public class LedgerInitOperationTest { for (int i = 0; i < parties.length; i++) { keys[i] = BlockchainKeyGenerator.getInstance().generate(); parties[i] = new ParticipantCertData(AddressEncoding.generateAddress(keys[i].getPubKey()), - "Participant[" + i + "]", keys[i].getPubKey()); + "Participant[" + i + "]", keys[i].getPubKey(), ParticipantNodeState.CONSENSUSED); } ParticipantCertData[] parties1 = Arrays.copyOf(parties, 4); diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitSettingSerializeTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitSettingSerializeTest.java index 46c96f65..2485cbd0 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitSettingSerializeTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerInitSettingSerializeTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertEquals; import java.util.Arrays; import java.util.Random; +import com.jd.blockchain.ledger.ParticipantNodeState; import org.junit.Before; import org.junit.Test; @@ -80,6 +81,7 @@ public class LedgerInitSettingSerializeTest { parties[i].setHostAddress(new NetworkAddress("192.168.10." + (10 + i), 10010 + 10 * i)); parties[i].setName("Participant[" + i + "]"); parties[i].setPubKey(keys[i].getPubKey()); + parties[i].setParticipantState(ParticipantNodeState.CONSENSUSED); } ConsensusParticipantData[] parties1 = Arrays.copyOf(parties, 4); @@ -122,7 +124,7 @@ public class LedgerInitSettingSerializeTest { for (int i = 0; i < parties.length; i++) { keys[i] = BlockchainKeyGenerator.getInstance().generate(); parties[i] = new ParticipantCertData(AddressEncoding.generateAddress(keys[i].getPubKey()), - "Participant[" + i + "]", keys[i].getPubKey()); + "Participant[" + i + "]", keys[i].getPubKey(), ParticipantNodeState.CONSENSUSED); } ParticipantCertData[] parties1 = Arrays.copyOf(parties, 4); diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerManagerTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerManagerTest.java index d814326d..6438ceb9 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerManagerTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerManagerTest.java @@ -45,6 +45,7 @@ public class LedgerManagerTest { DataContractRegistry.register(TransactionContent.class); DataContractRegistry.register(UserRegisterOperation.class); DataContractRegistry.register(DataAccountRegisterOperation.class); + DataContractRegistry.register(ParticipantNode.class); DataContractRegistry.register(ParticipantRegisterOperation.class); DataContractRegistry.register(ParticipantStateUpdateOperation.class); DataContractRegistry.register(BlockBody.class); @@ -204,6 +205,7 @@ public class LedgerManagerTest { parties[0].setPubKey(kp0.getPubKey()); parties[0].setAddress(AddressEncoding.generateAddress(kp0.getPubKey())); parties[0].setHostAddress(new NetworkAddress("127.0.0.1", 9000)); + parties[0].setParticipantState(ParticipantNodeState.CONSENSUSED); parties[1] = new ConsensusParticipantData(); parties[1].setId(1); @@ -212,6 +214,7 @@ public class LedgerManagerTest { parties[1].setPubKey(kp1.getPubKey()); parties[1].setAddress(AddressEncoding.generateAddress(kp1.getPubKey())); parties[1].setHostAddress(new NetworkAddress("127.0.0.1", 9010)); + parties[1].setParticipantState(ParticipantNodeState.CONSENSUSED); parties[2] = new ConsensusParticipantData(); parties[2].setId(2); @@ -220,6 +223,7 @@ public class LedgerManagerTest { parties[2].setPubKey(kp2.getPubKey()); parties[2].setAddress(AddressEncoding.generateAddress(kp2.getPubKey())); parties[2].setHostAddress(new NetworkAddress("127.0.0.1", 9020)); + parties[2].setParticipantState(ParticipantNodeState.CONSENSUSED); parties[3] = new ConsensusParticipantData(); parties[3].setId(3); @@ -228,6 +232,7 @@ public class LedgerManagerTest { parties[3].setPubKey(kp3.getPubKey()); parties[3].setAddress(AddressEncoding.generateAddress(kp3.getPubKey())); parties[3].setHostAddress(new NetworkAddress("127.0.0.1", 9030)); + parties[3].setParticipantState(ParticipantNodeState.CONSENSUSED); initSetting.setConsensusParticipants(parties); diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerMetaDataTest.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerMetaDataTest.java index e7cba7ad..6f208323 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerMetaDataTest.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerMetaDataTest.java @@ -7,8 +7,7 @@ import static org.junit.Assert.assertTrue; import java.util.Random; -import com.jd.blockchain.ledger.LedgerMetadata; -import com.jd.blockchain.ledger.LedgerSettings; +import com.jd.blockchain.ledger.*; import org.junit.Before; import org.junit.Test; @@ -23,8 +22,6 @@ import com.jd.blockchain.crypto.PubKey; 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.ParticipantNode; import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.LedgerAdminDataset; import com.jd.blockchain.ledger.core.LedgerConfiguration; @@ -189,7 +186,7 @@ public class LedgerMetaDataTest { // NetworkAddress consensusAddress = new NetworkAddress("192.168.1.1", 9001, // false); Bytes address = AddressEncoding.generateAddress(pubKey); - ParticipantCertData participantCertData = new ParticipantCertData(address, name, pubKey); + ParticipantCertData participantCertData = new ParticipantCertData(address, name, pubKey, ParticipantNodeState.CONSENSUSED); // encode and decode byte[] encodeBytes = BinaryProtocol.encode(participantCertData, ParticipantNode.class); diff --git a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerTestUtils.java b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerTestUtils.java index eb6835b5..be201848 100644 --- a/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerTestUtils.java +++ b/source/ledger/ledger-core/src/test/java/test/com/jd/blockchain/ledger/core/LedgerTestUtils.java @@ -11,13 +11,7 @@ import com.jd.blockchain.crypto.SignatureFunction; 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.BlockchainKeypair; -import com.jd.blockchain.ledger.CryptoSetting; -import com.jd.blockchain.ledger.LedgerInitSetting; -import com.jd.blockchain.ledger.TransactionRequest; -import com.jd.blockchain.ledger.TransactionRequestBuilder; -import com.jd.blockchain.ledger.TransactionResponse; +import com.jd.blockchain.ledger.*; import com.jd.blockchain.ledger.core.CryptoConfig; import com.jd.blockchain.ledger.core.TransactionStagedSnapshot; import com.jd.blockchain.transaction.ConsensusParticipantData; @@ -74,6 +68,7 @@ public class LedgerTestUtils { parties[i].setPubKey(partiKeys[i].getPubKey()); parties[i].setAddress(AddressEncoding.generateAddress(partiKeys[i].getPubKey())); parties[i].setHostAddress(new NetworkAddress("192.168.1." + (10 + i), 9000)); + parties[i].setParticipantState(ParticipantNodeState.CONSENSUSED); } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerInitProperties.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerInitProperties.java index ad946049..86900b1c 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerInitProperties.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/LedgerInitProperties.java @@ -441,6 +441,7 @@ public class LedgerInitProperties { private NetworkAddress initializerAddress; + @Override public int getId() { return id; } @@ -454,6 +455,7 @@ public class LedgerInitProperties { return address; } + @Override public String getName() { return name; } @@ -470,6 +472,7 @@ public class LedgerInitProperties { // this.pubKeyPath = pubKeyPath; // } + @Override public ParticipantNodeState getParticipantNodeState() { return participantNodeState; } @@ -486,6 +489,7 @@ public class LedgerInitProperties { this.initializerAddress = initializerAddress; } + @Override public PubKey getPubKey() { return pubKey; } diff --git a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ConsensusParticipantData.java b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ConsensusParticipantData.java index 7b5cfd17..e182ced1 100644 --- a/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ConsensusParticipantData.java +++ b/source/ledger/ledger-model/src/main/java/com/jd/blockchain/transaction/ConsensusParticipantData.java @@ -20,7 +20,7 @@ public class ConsensusParticipantData implements ParticipantNode { private ParticipantNodeState participantNodeState; - + @Override public int getId() { return id; } @@ -29,6 +29,7 @@ public class ConsensusParticipantData implements ParticipantNode { this.id = id; } + @Override public String getName() { return name; } @@ -37,7 +38,7 @@ public class ConsensusParticipantData implements ParticipantNode { this.name = name; } - public NetworkAddress getConsensusAddress() { + public NetworkAddress getHostAddress() { return hostAddress; } @@ -45,6 +46,7 @@ public class ConsensusParticipantData implements ParticipantNode { this.hostAddress = hostAddress; } + @Override public PubKey getPubKey() { return pubKey; } @@ -53,6 +55,7 @@ public class ConsensusParticipantData implements ParticipantNode { this.pubKey = pubKey; } + @Override public Bytes getAddress() { return address; } @@ -61,6 +64,7 @@ public class ConsensusParticipantData implements ParticipantNode { this.address = address; } + @Override public ParticipantNodeState getParticipantNodeState() { return participantNodeState; }