Search in sources :

Example 6 with ProtocolContainer

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);
}
Also used : ProtocolContainer(io.nuls.protocol.base.version.ProtocolContainer) BlockExtendsData(io.nuls.consensus.poc.model.BlockExtendsData) ProtocolTempInfoPo(io.nuls.protocol.storage.po.ProtocolTempInfoPo) MeetingRound(io.nuls.consensus.poc.model.MeetingRound)

Example 7 with ProtocolContainer

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();
}
Also used : ProtocolContainer(io.nuls.protocol.base.version.ProtocolContainer) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ProtocolTempInfoPo(io.nuls.protocol.storage.po.ProtocolTempInfoPo) ArrayList(java.util.ArrayList) List(java.util.List) BlockHeader(io.nuls.kernel.model.BlockHeader) ProtocolContainerDTO(io.nuls.client.rpc.resources.dto.ProtocolContainerDTO) ApiOperation(io.swagger.annotations.ApiOperation) ApiResponses(io.swagger.annotations.ApiResponses)

Example 8 with ProtocolContainer

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);
    }
}
Also used : ProtocolContainer(io.nuls.protocol.base.version.ProtocolContainer) ProtocolTempInfoPo(io.nuls.protocol.storage.po.ProtocolTempInfoPo)

Example 9 with ProtocolContainer

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();
}
Also used : ProtocolContainer(io.nuls.protocol.base.version.ProtocolContainer)

Aggregations

ProtocolContainer (io.nuls.protocol.base.version.ProtocolContainer)9 BlockHeader (io.nuls.kernel.model.BlockHeader)3 ProtocolTempInfoPo (io.nuls.protocol.storage.po.ProtocolTempInfoPo)3 BlockExtendsData (io.nuls.consensus.poc.model.BlockExtendsData)2 ProtocolInfoPo (io.nuls.protocol.storage.po.ProtocolInfoPo)2 ProtocolContainerDTO (io.nuls.client.rpc.resources.dto.ProtocolContainerDTO)1 MeetingRound (io.nuls.consensus.poc.model.MeetingRound)1 NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)1 BlockService (io.nuls.protocol.service.BlockService)1 ApiOperation (io.swagger.annotations.ApiOperation)1 ApiResponses (io.swagger.annotations.ApiResponses)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1