Browse Source

Initial revision of the code merger

tags/1.1.0
zhangshuang 5 years ago
parent
commit
4b48e9a22b
15 changed files with 92 additions and 550 deletions
  1. +5
    -8
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DefaultOperationHandleRegisteration.java
  2. +0
    -365
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminAccount.java
  3. +12
    -0
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/LedgerAdminDataset.java
  4. +23
    -37
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java
  5. +23
    -22
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java
  6. +0
    -61
      source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/impl/DefaultOperationHandleRegisteration.java
  7. +3
    -3
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfo.java
  8. +2
    -12
      source/ledger/ledger-model/src/main/java/com/jd/blockchain/ledger/ParticipantInfoData.java
  9. +4
    -22
      source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java
  10. +3
    -3
      source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java
  11. +2
    -2
      source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java
  12. +1
    -1
      source/test/test-integration/src/main/java/test/com/jd/blockchain/intgr/perf/Utils.java
  13. +2
    -2
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java
  14. +6
    -6
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4Bftsmart.java
  15. +6
    -6
      source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationTest4MQ.java

+ 5
- 8
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/DefaultOperationHandleRegisteration.java View File

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


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

@@ -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;
/**
* 原来的账本设置;
*
* <br>
* 对 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;
}
/**
* 初始化账本的管理账户;
*
* <br>
*
* 只在新建账本时调用此方法;
*
* @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;
}
/**
* 返回原来的账本配置;
*
* <br>
* 此方法总是返回从上一个区块加载的账本配置,即时调用 {@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;
}
}
}

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

@@ -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();


+ 23
- 37
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantRegisterOperationHandle.java View File

@@ -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<ParticipantRegisterOperation> {
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 {
}
}


}

+ 23
- 22
source/ledger/ledger-core/src/main/java/com/jd/blockchain/ledger/core/handles/ParticipantStateUpdateOperationHandle.java View File

@@ -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<ParticipantStateUpdateOperation> {
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;
}



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

@@ -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<OperationHandle> 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() + "]!");
}

}

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

@@ -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();

/**
* 参与者名称;


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

@@ -18,25 +18,15 @@ 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;
}


+ 4
- 22
source/sdk/sdk-base/src/main/java/com/jd/blockchain/sdk/converters/ClientResolveUtil.java View File

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


+ 3
- 3
source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_Regist_Test_.java View File

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


+ 2
- 2
source/sdk/sdk-samples/src/test/java/test/com/jd/blockchain/sdk/test/SDK_GateWay_Participant_State_Update_Test_.java View File

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



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

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


+ 2
- 2
source/test/test-integration/src/test/java/test/com/jd/blockchain/intgr/IntegrationBase.java View File

@@ -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());



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

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


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

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


Loading…
Cancel
Save