Search in sources :

Example 1 with ProtocolContainer

use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.

the class ConsensusScheduler method initNulsProtocol.

private void initNulsProtocol() {
    try {
        // 针对第一版本升级时的特殊处理
        NulsVersionManager.init();
        BlockService blockService = NulsContext.getServiceBean(BlockService.class);
        // 获取最新的记录版本信息的高度
        Long consensusVersionHeight = getVersionManagerStorageService().getConsensusVersionHeight();
        if (consensusVersionHeight == null) {
            // todo 正式上线这里会改成1200000L
            consensusVersionHeight = ProtocolConstant.START_CHECK_PROTOCOL_HEIGHT;
        }
        NulsVersionManager.loadVersionByHeight(consensusVersionHeight);
        ProtocolContainer container = NulsVersionManager.getProtocolContainer(NulsContext.MAIN_NET_VERSION);
        if (container != null) {
            NulsContext.MAIN_NET_VERSION_HEIGHT = container.getEffectiveHeight();
        }
        // 获取最新的区块高度
        long bestHeight = blockService.getBestBlockHeader().getData().getHeight();
        // 检查记录的版本最新高度和区块的最新高度是否一致,如果不一致,找出中间相差的块,再做统计
        if (consensusVersionHeight < bestHeight) {
            for (long i = consensusVersionHeight; i <= bestHeight; i++) {
                Result<BlockHeader> result = blockService.getBlockHeader(i);
                if (result.isSuccess()) {
                    NulsProtocolProcess.getInstance().processProtocolUpGrade(result.getData());
                }
            }
        }
    } catch (Exception e) {
        Log.error(e);
        System.exit(-1);
    }
}
Also used : ProtocolContainer(io.nuls.protocol.base.version.ProtocolContainer) BlockService(io.nuls.protocol.service.BlockService) BlockHeader(io.nuls.kernel.model.BlockHeader) NulsRuntimeException(io.nuls.kernel.exception.NulsRuntimeException)

Example 2 with ProtocolContainer

use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.

the class NulsProtocolProcess method saveContainerList.

private void saveContainerList(long versionHeight) {
    List<ProtocolInfoPo> infoPoList = new ArrayList<>();
    for (ProtocolContainer container : NulsVersionManager.getAllProtocolContainers().values()) {
        ProtocolInfoPo infoPo = ProtocolTransferTool.toProtocolInfoPo(container);
        infoPoList.add(infoPo);
    }
    getVersionManagerStorageService().saveProtocolInfoList(versionHeight, infoPoList);
}
Also used : ProtocolContainer(io.nuls.protocol.base.version.ProtocolContainer) ProtocolInfoPo(io.nuls.protocol.storage.po.ProtocolInfoPo)

Example 3 with ProtocolContainer

use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.

the class NulsProtocolProcess method calcDelay.

private void calcDelay(BlockHeader blockHeader, BlockExtendsData extendsData) {
    for (ProtocolContainer container : NulsVersionManager.getAllProtocolContainers().values()) {
        if (container.getStatus() != ProtocolContainer.DELAY_LOCK || container.getVersion() < NulsContext.MAIN_NET_VERSION) {
            continue;
        }
        container.setRoundIndex(extendsData.getRoundIndex());
        container.setCurrentDelay(container.getCurrentDelay() + 1);
        // 当延迟块数达到升级条件时,改变协议状态为生效
        if (container.getCurrentDelay() >= container.getDelay()) {
            upgradeProtocol(container, blockHeader);
            Log.info("********** 协议生效了!!!!!!!!! **********");
            Log.info("********** 协议生效了!!!!!!!!! **********");
            Log.info("********** 协议生效了!!!!!!!!! **********");
            Log.info("********** 当前协议生效下一块开始执行新协议 **********");
            Log.info("********** 生效协议version:" + container.getVersion());
            Log.info("********** 生效协议高度:" + container.getEffectiveHeight());
        }
    }
}
Also used : ProtocolContainer(io.nuls.protocol.base.version.ProtocolContainer)

Example 4 with ProtocolContainer

use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.

the class NulsProtocolProcess method calculateProtocols.

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

Example 5 with ProtocolContainer

use of io.nuls.protocol.base.version.ProtocolContainer in project nuls by nuls-io.

the class NulsProtocolProcess method containerRollBack.

private void containerRollBack(long versionHeight) {
    List<ProtocolInfoPo> infoPoList = getVersionManagerStorageService().getProtocolInfoList(versionHeight);
    // 用数据库已保存的每个区块统计的协议信息覆盖容器
    if (infoPoList != null && !infoPoList.isEmpty()) {
        for (ProtocolInfoPo infoPo : infoPoList) {
            ProtocolContainer container = NulsVersionManager.getProtocolContainer(infoPo.getVersion());
            copyProtocolFromInfoPo(container, infoPo);
        }
    }
    ProtocolContainer container = NulsVersionManager.getProtocolContainer(NulsContext.MAIN_NET_VERSION);
    if (container.getStatus() != ProtocolContainer.VALID) {
        int version = NulsContext.MAIN_NET_VERSION;
        while (true) {
            version--;
            container = NulsVersionManager.getProtocolContainer(version);
            if (container.getStatus() == ProtocolContainer.VALID) {
                break;
            }
        }
        NulsContext.MAIN_NET_VERSION = version;
        NulsContext.MAIN_NET_VERSION_HEIGHT = container.getEffectiveHeight();
        getVersionManagerStorageService().saveMainVersion(version);
        if (version == 1) {
            getVersionManagerStorageService().deleteChangeTxHashBlockHeight();
        }
    }
}
Also used : ProtocolContainer(io.nuls.protocol.base.version.ProtocolContainer) ProtocolInfoPo(io.nuls.protocol.storage.po.ProtocolInfoPo)

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