use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.
the class NulsProtocolProcess method processProtocolUpGrade.
/**
* 版本升级
* 升级规则:
* 1.通过block.extend字段获取当前出块人的版本号
* 2.如果一个节点出块的版本号为N,之后若未收到过该节点继续出块,视为该出块节点版本号为N,
* 3.记录每一轮都有哪些节点出过哪些个版本的块,若某个版本达到覆盖率后,从下一轮开始进入延迟块数的累计
* 4.进入延迟块数累计的版本,若下一轮覆盖率未达标,则延迟块数清理,待重新达标后进入延迟块的统计
*
* @param blockHeader
*/
public void processProtocolUpGrade(BlockHeader blockHeader) {
BlockExtendsData extendsData = new BlockExtendsData(blockHeader.getExtend());
String packingAddress = blockHeader.getPackingAddressStr();
MeetingRound currentRound = PocConsensusContext.getChainManager().getMasterChain().getRoundManager().getRoundByIndex(extendsData.getRoundIndex());
// 临时处理为空的情况,为空是由于第一个版本的区块不包含版本信息字段
if (extendsData.getCurrentVersion() == null) {
extendsData.setCurrentVersion(1);
}
// 处理有人发送错误的版本格式情况
if (extendsData.getCurrentVersion() < 1) {
return;
}
NulsVersionManager.getConsensusVersionMap().put(packingAddress, extendsData.getCurrentVersion());
calculateCoverageEveryRound(blockHeader, extendsData, currentRound);
containerRemoveAddress(packingAddress);
// 收到的新块版本号大于当前主网版本时
if (extendsData.getCurrentVersion() > NulsContext.MAIN_NET_VERSION) {
// 能找到本地对应的版本号配置,走正常升级流程
ProtocolContainer container = NulsVersionManager.getProtocolContainer(extendsData.getCurrentVersion());
if (container != null) {
processHigherVersion(blockHeader, extendsData, packingAddress, container);
} else {
// 不能找到配置,说明当前也许有更高版本的配置,走临时保存流程
ProtocolTempInfoPo tempInfoPo = NulsVersionManager.getTempProtocolContainer(extendsData.getProtocolKey());
if (tempInfoPo == null) {
tempInfoPo = ProtocolTransferTool.createProtocolTempInfoPo(extendsData);
NulsVersionManager.addTempProtocolContainer(tempInfoPo);
}
processTempHigherVersion(blockHeader, extendsData, packingAddress, tempInfoPo);
}
} else {
calcDelay(blockHeader, extendsData);
calcTempDelay(blockHeader, extendsData);
}
saveProtocol(blockHeader);
}
use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.
the class ClientResource method getProtocolInfo.
@GET
@Path("/protocol/info")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation(value = "协议版本升级统计信息")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = ProtocolContainerDTO.class) })
public RpcClientResult getProtocolInfo() {
BlockHeader blockHeader = NulsContext.getInstance().getBestBlock().getHeader();
List<ProtocolContainerDTO> list = new ArrayList<>();
ProtocolContainer protocolContainer = NulsVersionManager.getProtocolContainer(NulsContext.CURRENT_PROTOCOL_VERSION);
ProtocolContainerDTO pcDTO = new ProtocolContainerDTO(protocolContainer);
if (pcDTO.getStatus() == ProtocolContainer.DELAY_LOCK) {
pcDTO.setEffectiveHeight(blockHeader.getHeight() + pcDTO.getCountdownDelay() + 1);
}
list.add(pcDTO);
Map<String, ProtocolTempInfoPo> protocolTempMap = versionManagerStorageService.getProtocolTempMap();
for (ProtocolTempInfoPo protocolTempInfoPo : protocolTempMap.values()) {
ProtocolContainerDTO protocolContainerDTO = new ProtocolContainerDTO(protocolTempInfoPo);
if (protocolContainerDTO.getStatus() == ProtocolContainer.DELAY_LOCK) {
protocolContainerDTO.setEffectiveHeight(blockHeader.getHeight() + protocolContainerDTO.getCountdownDelay() + 1);
}
list.add(protocolContainerDTO);
}
Map<String, List<ProtocolContainerDTO>> map = new HashMap<>();
map.put("list", list);
return Result.getSuccess().setData(map).toRpcClientResult();
}
use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.
the class NulsProtocolProcess method tempContainerRollBack.
private void tempContainerRollBack(BlockHeader blockHeader, long versionHeight) {
boolean reProcess = false;
List<ProtocolTempInfoPo> tempInfoPoList = getVersionManagerStorageService().getProtocolTempInfoList(versionHeight);
if (tempInfoPoList == null || tempInfoPoList.isEmpty()) {
return;
}
// 遇到这个情况的时候,需要复制到container里,重新保存到数据库后,再递归判断是否还有
for (int i = tempInfoPoList.size() - 1; i >= 0; i--) {
ProtocolTempInfoPo tempInfoPo = tempInfoPoList.get(i);
ProtocolContainer container = NulsVersionManager.getProtocolContainer(tempInfoPo.getVersion(), tempInfoPo.getPercent(), tempInfoPo.getDelay());
if (container != null) {
copyProtocolFromTempInfoPo(container, tempInfoPo);
getVersionManagerStorageService().removeProtocolTempInfoList(versionHeight);
saveProtocol(blockHeader);
reProcess = true;
break;
}
}
if (reProcess) {
tempContainerRollBack(blockHeader, versionHeight);
} else {
Map<String, ProtocolTempInfoPo> tempContainers = new HashMap<>();
for (ProtocolTempInfoPo tempInfoPo : tempInfoPoList) {
tempContainers.put(tempInfoPo.getProtocolKey(), tempInfoPo);
}
NulsVersionManager.setTempProtocolContainers(tempContainers);
}
}
use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.
the class TxEffectiveValidator method validate.
@Override
public ValidateResult validate(Transaction tx) {
int txType = tx.getType();
ProtocolContainer container = NulsVersionManager.getCurrentProtocolContainer();
if (!container.containsTxType(txType)) {
return ValidateResult.getFailedResult(this.getClass().getName(), TransactionErrorCode.TX_NOT_EFFECTIVE);
}
return ValidateResult.getSuccessResult();
}
Aggregations