Search in sources :

Example 6 with BlockHeader

use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.

the class OrphanBlockProcess method checkHasExist.

/*
     * Check the existence of this block from the forked chain and the isolated chain
     * 从分叉链和孤立链中检查,是否存在该区块
     */
private boolean checkHasExist(NulsDigestData blockHash) {
    for (Iterator<ChainContainer> it = chainManager.getOrphanChains().iterator(); it.hasNext(); ) {
        ChainContainer chainContainer = it.next();
        for (BlockHeader header : chainContainer.getChain().getAllBlockHeaderList()) {
            if (header.getHash().equals(blockHash)) {
                return true;
            }
        }
    }
    for (Iterator<ChainContainer> it = chainManager.getChains().iterator(); it.hasNext(); ) {
        ChainContainer chainContainer = it.next();
        for (BlockHeader header : chainContainer.getChain().getAllBlockHeaderList()) {
            if (header.getHash().equals(blockHash)) {
                return true;
            }
        }
    }
    List<BlockHeader> masterChainBlockHeaderList = chainManager.getMasterChain().getChain().getAllBlockHeaderList();
    int size = (int) (masterChainBlockHeaderList.size() - PocConsensusConstant.MAX_ISOLATED_BLOCK_COUNT * 1.05);
    if (size < 0) {
        size = 0;
    }
    for (int i = masterChainBlockHeaderList.size() - 1; i >= size; i--) {
        if (blockHash.equals(masterChainBlockHeaderList.get(i).getHash())) {
            return true;
        }
    }
    return false;
}
Also used : ChainContainer(io.nuls.consensus.poc.container.ChainContainer) BlockHeader(io.nuls.kernel.model.BlockHeader)

Example 7 with BlockHeader

use of io.nuls.kernel.model.BlockHeader 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 8 with BlockHeader

use of io.nuls.kernel.model.BlockHeader 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 9 with BlockHeader

use of io.nuls.kernel.model.BlockHeader 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 10 with BlockHeader

use of io.nuls.kernel.model.BlockHeader in project nuls by nuls-io.

the class BifurcationUtil method validate.

public ValidateResult validate(BlockHeader header) {
    ValidateResult result = ValidateResult.getSuccessResult();
    if (NulsContext.MAIN_NET_VERSION <= 1) {
        return result;
    }
    if (ConsensusConfig.getSeedNodeStringList().indexOf(AddressTool.getStringAddressByBytes(header.getPackingAddress())) >= 0) {
        return result;
    }
    if (header.getHeight() == 0L) {
        return result;
    }
    if (header.getHeight() > NulsContext.getInstance().getBestHeight()) {
        return result;
    }
    BlockHeader otherBlockHeader = blockService.getBlockHeader(header.getHeight()).getData();
    if (null != otherBlockHeader && !otherBlockHeader.getHash().equals(header.getHash()) && Arrays.equals(otherBlockHeader.getPackingAddress(), header.getPackingAddress())) {
        Log.info("-+-+-+-+-+-+-+-+- Received block with the same height and different hashes as the latest local block -+-+-+-+-+-+-+-+- ");
        Log.info("-+-+-+-+-+-+-+-+- height:" + header.getHeight() + ", hash of received block:" + header.getHash().getDigestHex() + ", hash of local latest block:" + otherBlockHeader.getHash().getDigestHex());
        Log.info("-+-+-+-+-+-+-+-+- Packing address of received block:" + AddressTool.getStringAddressByBytes(header.getPackingAddress()) + ", Packing address of local latest block:" + AddressTool.getStringAddressByBytes(otherBlockHeader.getPackingAddress()));
        List<Agent> agentList = PocConsensusContext.getChainManager().getMasterChain().getChain().getAgentList();
        Agent agent = null;
        for (Agent a : agentList) {
            if (a.getDelHeight() > 0) {
                continue;
            }
            if (Arrays.equals(a.getPackingAddress(), header.getPackingAddress())) {
                agent = a;
                break;
            }
        }
        if (null == agent) {
            return result;
        }
        recordEvidence(agent, header, otherBlockHeader);
        if (!isRedPunish(agent)) {
            return result;
        }
        RedPunishTransaction redPunishTransaction = new RedPunishTransaction();
        RedPunishData redPunishData = new RedPunishData();
        redPunishData.setAddress(agent.getAgentAddress());
        long txTime = 0;
        try {
            // 连续3轮 每一轮两个区块头作为证据 一共 3 * 2 个区块头作为证据
            byte[][] headers = new byte[NulsContext.REDPUNISH_BIFURCATION * 2][];
            List<Evidence> list = bifurcationEvidenceMap.get(AddressTool.getStringAddressByBytes(agent.getPackingAddress()));
            for (int i = 0; i < list.size() && i < NulsContext.REDPUNISH_BIFURCATION; i++) {
                Evidence evidence = list.get(i);
                int s = i * 2;
                headers[s] = evidence.getBlockHeader1().serialize();
                headers[++s] = evidence.getBlockHeader2().serialize();
                txTime = (evidence.getBlockHeader1().getTime() + evidence.getBlockHeader2().getTime()) / 2;
            }
            redPunishData.setEvidence(ArraysTool.concatenate(headers));
        } catch (Exception e) {
            Log.error(e);
            return result;
        }
        redPunishData.setReasonCode(PunishReasonEnum.BIFURCATION.getCode());
        redPunishTransaction.setTxData(redPunishData);
        redPunishTransaction.setTime(txTime);
        CoinData coinData = null;
        try {
            coinData = ConsensusTool.getStopAgentCoinData(agent, redPunishTransaction.getTime() + PocConsensusConstant.RED_PUNISH_LOCK_TIME);
        } catch (IOException e) {
            Log.error(e);
            return result;
        }
        redPunishTransaction.setCoinData(coinData);
        try {
            redPunishTransaction.setHash(NulsDigestData.calcDigestData(redPunishTransaction.serializeForHash()));
        } catch (IOException e) {
            Log.error(e);
            return result;
        }
        TxMemoryPool.getInstance().add(redPunishTransaction, false);
        return result;
    }
    return result;
}
Also used : Agent(io.nuls.consensus.poc.protocol.entity.Agent) RedPunishTransaction(io.nuls.consensus.poc.protocol.tx.RedPunishTransaction) CoinData(io.nuls.kernel.model.CoinData) ValidateResult(io.nuls.kernel.validate.ValidateResult) IOException(java.io.IOException) IOException(java.io.IOException) RedPunishData(io.nuls.consensus.poc.protocol.entity.RedPunishData) Evidence(io.nuls.consensus.poc.model.Evidence) BlockHeader(io.nuls.kernel.model.BlockHeader)

Aggregations

BlockHeader (io.nuls.kernel.model.BlockHeader)40 Block (io.nuls.kernel.model.Block)8 BlockExtendsData (io.nuls.consensus.poc.model.BlockExtendsData)7 NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)7 NulsDigestData (io.nuls.kernel.model.NulsDigestData)7 ArrayList (java.util.ArrayList)7 PunishLogPo (io.nuls.consensus.poc.storage.po.PunishLogPo)5 Result (io.nuls.kernel.model.Result)5 ValidateResult (io.nuls.kernel.validate.ValidateResult)4 IOException (java.io.IOException)4 ChainContainer (io.nuls.consensus.poc.container.ChainContainer)3 Agent (io.nuls.consensus.poc.protocol.entity.Agent)3 AgentPo (io.nuls.consensus.poc.storage.po.AgentPo)3 ProtocolContainer (io.nuls.protocol.base.version.ProtocolContainer)3 Chain (io.nuls.consensus.poc.model.Chain)2 RedPunishData (io.nuls.consensus.poc.protocol.entity.RedPunishData)2 YellowPunishData (io.nuls.consensus.poc.protocol.entity.YellowPunishData)2 DepositPo (io.nuls.consensus.poc.storage.po.DepositPo)2 ContractResult (io.nuls.contract.dto.ContractResult)2 BlockHeaderDto (io.nuls.contract.entity.BlockHeaderDto)2