Search in sources :

Example 1 with ProtocolTempInfoPo

use of io.nuls.protocol.storage.po.ProtocolTempInfoPo in project nuls by nuls-io.

the class NulsVersionManager method loadVersionByHeight.

public static void loadVersionByHeight(long versionHeight) {
    List<ProtocolInfoPo> infoPoList = getVersionManagerStorageService().getProtocolInfoList(versionHeight);
    // 获取数据库已保存的协议信息
    if (infoPoList != null && !infoPoList.isEmpty()) {
        for (ProtocolInfoPo infoPo : infoPoList) {
            ProtocolContainer container = getProtocolContainer(infoPo.getVersion());
            copyProtocolFromInfoPo(container, infoPo);
        }
    }
    // 获取数据库已保存的临时协议信息,如果发现临时协议信息在最新版本里能查询到就复制到最新版本信息里
    List<ProtocolTempInfoPo> tempInfoPoList = getVersionManagerStorageService().getProtocolTempInfoList(versionHeight);
    if (tempInfoPoList == null) {
        return;
    }
    for (int i = 0; i < tempInfoPoList.size(); i++) {
        ProtocolTempInfoPo tempInfoPo = tempInfoPoList.get(i);
        ProtocolContainer container = getProtocolContainer(tempInfoPo.getVersion());
        if (container != null) {
            copyProtocolFromTempInfoPo(container, tempInfoPo);
            // 如果有协议升级了,要做升级相关处理
            if (container.getStatus() == ProtocolContainer.VALID && container.getVersion() > NulsContext.MAIN_NET_VERSION) {
                NulsContext.MAIN_NET_VERSION = container.getVersion();
                NulsContext.MAIN_NET_VERSION_HEIGHT = container.getEffectiveHeight();
                getVersionManagerStorageService().saveMainVersion(NulsContext.MAIN_NET_VERSION);
                // 如果是版本号为2的协议生效后,记录一下生效区块的高度,从当前高度后的交易,序列化hash方法需要改变
                if (container.getVersion() == 2) {
                    getVersionManagerStorageService().saveChangeTxHashBlockHeight(container.getEffectiveHeight());
                    NulsContext.CHANGE_HASH_SERIALIZE_HEIGHT = container.getEffectiveHeight();
                }
            }
            continue;
        }
        // 如果有临时协议已经生效,说明当前版本不是最新版本,需要强制升级
        if (tempInfoPo.getStatus() == ProtocolContainer.VALID) {
            NulsContext.mastUpGrade = true;
        }
        tempContainerMap.put(tempInfoPo.getProtocolKey(), tempInfoPo);
    }
}
Also used : ProtocolInfoPo(io.nuls.protocol.storage.po.ProtocolInfoPo) ProtocolTempInfoPo(io.nuls.protocol.storage.po.ProtocolTempInfoPo)

Example 2 with ProtocolTempInfoPo

use of io.nuls.protocol.storage.po.ProtocolTempInfoPo in project nuls by nuls-io.

the class VersionManagerStorageServiceImpl method getProtocolTempMap.

@Override
public Map<String, ProtocolTempInfoPo> getProtocolTempMap() {
    List<ProtocolTempInfoPo> list = dbService.values(ProtocolStorageConstant.PROTOCOL_TEMP_AREA, ProtocolTempInfoPo.class);
    Map<String, ProtocolTempInfoPo> map = new HashMap<>();
    if (null == list) {
        return map;
    }
    for (ProtocolTempInfoPo protocolTempInfoPo : list) {
        map.put((protocolTempInfoPo.getProtocolKey()), protocolTempInfoPo);
    }
    return map;
}
Also used : HashMap(java.util.HashMap) ProtocolTempInfoPo(io.nuls.protocol.storage.po.ProtocolTempInfoPo)

Example 3 with ProtocolTempInfoPo

use of io.nuls.protocol.storage.po.ProtocolTempInfoPo in project nuls by nuls-io.

the class NulsProtocolProcess method calculateTempProtocols.

private void calculateTempProtocols(BlockExtendsData extendsData, BlockHeader header, Set<String> memberAddressSet) {
    for (ProtocolTempInfoPo tempInfoPo : NulsVersionManager.getTempProtocolContainers().values()) {
        // 如果容器的轮次小于当前出块节点的轮次,说明是新的一轮开始
        if (tempInfoPo.getStatus() != ProtocolContainer.VALID && tempInfoPo.getRoundIndex() < extendsData.getRoundIndex()) {
            // 获取上一个块,得到上一轮的共识节点数量
            Result<BlockHeader> result = getBlockService().getBlockHeader(header.getPreHash());
            BlockHeader preHeader = result.getData();
            BlockExtendsData preExtendsData = new BlockExtendsData(preHeader.getExtend());
            // 计算上一轮的覆盖率
            int rate = calcRate(tempInfoPo, preExtendsData);
            tempInfoPo.setCurrentPercent(rate);
            if (rate < tempInfoPo.getPercent()) {
                tempInfoPo.setStatus(ProtocolContainer.INVALID);
                tempInfoPo.setCurrentDelay(0);
            } else {
                tempInfoPo.setStatus(ProtocolContainer.DELAY_LOCK);
            }
            // 新的轮次开始时,也许会有节点时上一轮已经退出的,因此在这一轮里要去掉
            Iterator<String> iterator = tempInfoPo.getAddressSet().iterator();
            while (iterator.hasNext()) {
                String address = iterator.next();
                if (!memberAddressSet.contains(address)) {
                    iterator.remove();
                }
            }
        }
    }
}
Also used : BlockExtendsData(io.nuls.consensus.poc.model.BlockExtendsData) ProtocolTempInfoPo(io.nuls.protocol.storage.po.ProtocolTempInfoPo) BlockHeader(io.nuls.kernel.model.BlockHeader)

Example 4 with ProtocolTempInfoPo

use of io.nuls.protocol.storage.po.ProtocolTempInfoPo 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 5 with ProtocolTempInfoPo

use of io.nuls.protocol.storage.po.ProtocolTempInfoPo 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)

Aggregations

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