@@ -6,18 +6,11 @@ import java.util.List; | |||||
import java.util.Map; | import java.util.Map; | ||||
import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||
import com.jd.blockchain.ledger.core.handles.*; | |||||
import org.springframework.stereotype.Component; | import org.springframework.stereotype.Component; | ||||
import com.jd.blockchain.ledger.LedgerException; | import com.jd.blockchain.ledger.LedgerException; | ||||
import com.jd.blockchain.ledger.Operation; | 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.ContractCodeDeployOpTemplate; | ||||
import com.jd.blockchain.transaction.ContractEventSendOpTemplate; | import com.jd.blockchain.transaction.ContractEventSendOpTemplate; | ||||
import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; | import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; | ||||
@@ -50,6 +43,10 @@ public class DefaultOperationHandleRegisteration implements OperationHandleRegis | |||||
registerDefaultHandle(new ContractCodeDeployOperationHandle()); | registerDefaultHandle(new ContractCodeDeployOperationHandle()); | ||||
registerDefaultHandle(new JVMContractEventSendOperationHandle()); | registerDefaultHandle(new JVMContractEventSendOperationHandle()); | ||||
registerDefaultHandle(new ParticipantRegisterOperationHandle()); | |||||
registerDefaultHandle(new ParticipantStateUpdateOperationHandle()); | |||||
} | } | ||||
private static void registerDefaultHandle(OperationHandle handle) { | private static void registerDefaultHandle(OperationHandle handle) { | ||||
@@ -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; | |||||
} | |||||
} | |||||
} |
@@ -268,6 +268,8 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, | |||||
* | * | ||||
* @return | * @return | ||||
*/ | */ | ||||
@Override | |||||
public LedgerSettings getSettings() { | public LedgerSettings getSettings() { | ||||
return settings; | return settings; | ||||
} | } | ||||
@@ -309,6 +311,16 @@ public class LedgerAdminDataset implements Transactional, LedgerAdminDataQuery, | |||||
participants.addConsensusParticipant(participant); | participants.addConsensusParticipant(participant); | ||||
} | } | ||||
/** | |||||
* 更新参与方的状态参数; | |||||
* | |||||
* @param participant | |||||
*/ | |||||
public void updateParticipant(ParticipantNode participant) { | |||||
participants.updateConsensusParticipant(participant); | |||||
} | |||||
@Override | @Override | ||||
public boolean isUpdated() { | public boolean isUpdated() { | ||||
return updated || participants.isUpdated() || rolePrivileges.isUpdated() || userRoles.isUpdated(); | return updated || participants.isUpdated() || rolePrivileges.isUpdated() || userRoles.isUpdated(); | ||||
@@ -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.ConsensusProvider; | ||||
import com.jd.blockchain.consensus.ConsensusProviders; | 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.crypto.PubKey; | ||||
import com.jd.blockchain.ledger.*; | import com.jd.blockchain.ledger.*; | ||||
import com.jd.blockchain.ledger.core.*; | import com.jd.blockchain.ledger.core.*; | ||||
import com.jd.blockchain.ledger.core.impl.OperationHandleContext; | |||||
import com.jd.blockchain.utils.Bytes; | 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(); | PubKey pubKey = participantNode.getPubKey(); | ||||
BlockchainIdentityData identityData = new BlockchainIdentityData(pubKey); | 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 | // //reg participant as user | ||||
// dataset.getUserAccountSet().register(identityData.getAddress(), pubKey); | // dataset.getUserAccountSet().register(identityData.getAddress(), pubKey); | ||||
//add new participant as consensus node | //add new participant as consensus node | ||||
adminAccount.addParticipant(participantNode); | |||||
// Build UserRegisterOperation; | |||||
adminAccountDataSet.addParticipant(participantNode); | |||||
// Build UserRegisterOperation; | |||||
UserRegisterOperation userRegOp = null;// | UserRegisterOperation userRegOp = null;// | ||||
handleContext.handle(userRegOp); | handleContext.handle(userRegOp); | ||||
return null; | |||||
} | |||||
@Override | |||||
public boolean support(Class<?> operationType) { | |||||
return ParticipantRegisterOperation.class.isAssignableFrom(operationType); | |||||
} | } | ||||
private static class PartNode implements ParticipantNode { | private static class PartNode implements ParticipantNode { | ||||
private int id; | private int id; | ||||
private String address; | |||||
private Bytes address; | |||||
private String name; | private String name; | ||||
@@ -77,7 +62,7 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { | |||||
this.id = id; | this.id = id; | ||||
this.name = name; | this.name = name; | ||||
this.pubKey = pubKey; | this.pubKey = pubKey; | ||||
this.address = AddressEncoding.generateAddress(pubKey).toBase58(); | |||||
this.address = AddressEncoding.generateAddress(pubKey); | |||||
this.participantNodeState = participantNodeState; | this.participantNodeState = participantNodeState; | ||||
} | } | ||||
@@ -87,7 +72,7 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { | |||||
} | } | ||||
@Override | @Override | ||||
public String getAddress() { | |||||
public Bytes getAddress() { | |||||
return address; | return address; | ||||
} | } | ||||
@@ -107,4 +92,5 @@ public class ParticipantRegisterOperationHandle implements OperationHandle { | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -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.ConsensusProvider; | ||||
import com.jd.blockchain.consensus.ConsensusProviders; | 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.crypto.PubKey; | ||||
import com.jd.blockchain.ledger.*; | import com.jd.blockchain.ledger.*; | ||||
import com.jd.blockchain.ledger.core.*; | import com.jd.blockchain.ledger.core.*; | ||||
import com.jd.blockchain.ledger.core.impl.OperationHandleContext; | |||||
import com.jd.blockchain.utils.Bytes; | 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 | @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; | ParticipantNode participantNode = null; | ||||
@@ -39,25 +41,24 @@ public class ParticipantStateUpdateOperationHandle implements OperationHandle { | |||||
} | } | ||||
//update consensus setting | //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 static class PartNode implements ParticipantNode { | ||||
private int id; | private int id; | ||||
private String address; | |||||
private Bytes address; | |||||
private String name; | private String name; | ||||
@@ -69,7 +70,7 @@ public class ParticipantStateUpdateOperationHandle implements OperationHandle { | |||||
this.id = id; | this.id = id; | ||||
this.name = name; | this.name = name; | ||||
this.pubKey = pubKey; | this.pubKey = pubKey; | ||||
this.address = AddressEncoding.generateAddress(pubKey).toBase58(); | |||||
this.address = AddressEncoding.generateAddress(pubKey); | |||||
this.participantNodeState = participantNodeState; | this.participantNodeState = participantNodeState; | ||||
} | } | ||||
@@ -79,7 +80,7 @@ public class ParticipantStateUpdateOperationHandle implements OperationHandle { | |||||
} | } | ||||
@Override | @Override | ||||
public String getAddress() { | |||||
public Bytes getAddress() { | |||||
return address; | return address; | ||||
} | } | ||||
@@ -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() + "]!"); | |||||
} | |||||
} |
@@ -18,12 +18,12 @@ import com.jd.blockchain.utils.net.NetworkAddress; | |||||
public interface ParticipantInfo { | public interface ParticipantInfo { | ||||
/** | /** | ||||
* regist or unregist; | |||||
* regist or unregist, temporarily not available to users | |||||
* | * | ||||
* @return | * @return | ||||
*/ | */ | ||||
@DataField(order = 0, primitiveType = PrimitiveType.TEXT) | |||||
String getFlag(); | |||||
// @DataField(order = 0, primitiveType = PrimitiveType.TEXT) | |||||
// String getFlag(); | |||||
/** | /** | ||||
* 参与者名称; | * 参与者名称; | ||||
@@ -18,25 +18,15 @@ public class ParticipantInfoData implements ParticipantInfo { | |||||
private NetworkAddress networkAddress; | 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.name = name; | ||||
this.pubKey = pubKey; | this.pubKey = pubKey; | ||||
this.networkAddress = networkAddress; | this.networkAddress = networkAddress; | ||||
} | } | ||||
@Override | @Override | ||||
public String getFlag() { | |||||
return flag; | |||||
} | |||||
public void setFlag(String flag) { | |||||
this.flag = flag; | |||||
} | |||||
@Override | |||||
public String getName() { | public String getName() { | ||||
return name; | return name; | ||||
} | } | ||||
@@ -10,27 +10,13 @@ package com.jd.blockchain.sdk.converters; | |||||
import java.lang.reflect.Field; | import java.lang.reflect.Field; | ||||
import com.jd.blockchain.ledger.*; | |||||
import org.apache.commons.codec.binary.Base64; | import org.apache.commons.codec.binary.Base64; | ||||
import com.alibaba.fastjson.JSONArray; | import com.alibaba.fastjson.JSONArray; | ||||
import com.alibaba.fastjson.JSONObject; | import com.alibaba.fastjson.JSONObject; | ||||
import com.jd.blockchain.crypto.CryptoProvider; | import com.jd.blockchain.crypto.CryptoProvider; | ||||
import com.jd.blockchain.crypto.PubKey; | 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.ContractCodeDeployOpTemplate; | ||||
import com.jd.blockchain.transaction.ContractEventSendOpTemplate; | import com.jd.blockchain.transaction.ContractEventSendOpTemplate; | ||||
import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; | import com.jd.blockchain.transaction.DataAccountKVSetOpTemplate; | ||||
@@ -214,8 +200,7 @@ public class ClientResolveUtil { | |||||
JSONObject pubKeyObj = currConsensusParticipant.getJSONObject("pubKey"); | JSONObject pubKeyObj = currConsensusParticipant.getJSONObject("pubKey"); | ||||
String pubKeyBase58 = pubKeyObj.getString("value"); | String pubKeyBase58 = pubKeyObj.getString("value"); | ||||
// 生成ParticipantNode对象 | // 生成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; | participantNodes[i] = participantCertData; | ||||
} | } | ||||
ledgerInitSettingData.setConsensusParticipants(participantNodes); | ledgerInitSettingData.setConsensusParticipants(participantNodes); | ||||
@@ -309,7 +294,7 @@ public class ClientResolveUtil { | |||||
this.pubKey = participantNode.getPubKey(); | 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.id = id; | ||||
this.address = address; | this.address = address; | ||||
this.name = name; | this.name = name; | ||||
@@ -332,14 +317,11 @@ public class ClientResolveUtil { | |||||
return pubKey; | return pubKey; | ||||
} | } | ||||
@Override | |||||
public int getId() { | public int getId() { | ||||
return id; | return id; | ||||
} | } | ||||
public void setId(int id) { | |||||
this.id = id; | |||||
} | |||||
@Override | @Override | ||||
public ParticipantNodeState getParticipantNodeState() { | public ParticipantNodeState getParticipantNodeState() { | ||||
return participantNodeState; | return participantNodeState; | ||||
@@ -72,9 +72,9 @@ public class SDK_GateWay_Participant_Regist_Test_ { | |||||
//existed signer | //existed signer | ||||
AsymmetricKeypair keyPair = new BlockchainKeypair(pubKey, privKey); | 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)); | 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); | 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); | txTemp.participants().register(participantInfo); | ||||
@@ -71,9 +71,9 @@ public class SDK_GateWay_Participant_State_Update_Test_ { | |||||
//existed signer | //existed signer | ||||
AsymmetricKeypair keyPair = new BlockchainKeypair(pubKey, privKey); | 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)); | System.out.println("Address = "+AddressEncoding.generateAddress(pubKey)); | ||||
@@ -88,7 +88,7 @@ public class Utils { | |||||
public static ParticipantNode[] loadParticipantNodes() { | public static ParticipantNode[] loadParticipantNodes() { | ||||
ParticipantNode[] participantNodes = new ParticipantNode[PUB_KEYS.length]; | ParticipantNode[] participantNodes = new ParticipantNode[PUB_KEYS.length]; | ||||
for (int i = 0; i < PUB_KEYS.length; i++) { | 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; | return participantNodes; | ||||
} | } | ||||
@@ -175,7 +175,7 @@ public class IntegrationBase { | |||||
// 定义交易; | // 定义交易; | ||||
TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); | 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); | txTpl.participants().register(participantInfoData); | ||||
@@ -201,7 +201,7 @@ public class IntegrationBase { | |||||
// 定义交易; | // 定义交易; | ||||
TransactionTemplate txTpl = blockchainService.newTransaction(ledgerHash); | 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()); | ParticipantStateUpdateInfo stateUpdateInfo = new ParticipantStateUpdateInfoData(participantKeyPair.getPubKey(), ParticipantNodeState.CONSENSUSED, participantInfoData.getNetworkAddress()); | ||||
@@ -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(); | long userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); | ||||
@@ -162,28 +162,28 @@ public class IntegrationTest4Bftsmart { | |||||
participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); | 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(); | userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); | ||||
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); | ||||
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); | 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++) { | 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) { | if (isParticipantStateUpdate) { | ||||
IntegrationBase.testSDK_UpdateParticipantState(adminKey, new BlockchainKeypair(participantResponse.getKeyPair().getPubKey(), participantResponse.getKeyPair().getPrivKey()), ledgerHash, blockchainService); | 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); | 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++) { | 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 { | try { | ||||
@@ -147,7 +147,7 @@ public class IntegrationTest4MQ { | |||||
integrationBase.testSDK_Contract(adminKey, ledgerHash, blockchainService,ledgerRepository); | 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(); | long userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); | ||||
@@ -158,30 +158,30 @@ public class IntegrationTest4MQ { | |||||
participantResponse = IntegrationBase.testSDK_RegisterParticipant(adminKey, ledgerHash, blockchainService); | 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(); | userCount = ledgerRepository.getUserAccountSet(ledgerRepository.retrieveLatestBlock()).getTotalCount(); | ||||
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); | ||||
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); | 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++) { | 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) { | if (isParticipantStateUpdate) { | ||||
IntegrationBase.testSDK_UpdateParticipantState(adminKey, new BlockchainKeypair(participantResponse.getKeyPair().getPubKey(), participantResponse.getKeyPair().getPrivKey()), ledgerHash, blockchainService); | 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); | 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++) { | 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); | IntegrationBase.testConsistencyAmongNodes(ledgers); | ||||