Search in sources :

Example 1 with BlockHeaderEvent

use of io.nuls.consensus.event.BlockHeaderEvent in project nuls by nuls-io.

the class GetBlockHeaderHandler method onEvent.

@Override
public void onEvent(GetBlockHeaderEvent event, String fromId) {
    BlockHeader header;
    if (null == event.getEventBody() || event.getEventBody().getHeight() == 0) {
        header = blockService.getLocalBestBlock().getHeader();
    } else {
        Block block = blockService.getBlock(event.getEventBody().getHeight());
        if (null == block) {
            header = new BlockHeader();
            header.setHeight(event.getEventBody().getHeight());
        } else {
            header = block.getHeader();
        }
    }
    if (header == null) {
        Log.error("header cannot be null");
        return;
    }
    this.eventBroadcaster.sendToNode(new BlockHeaderEvent(header), fromId);
}
Also used : BlockHeaderEvent(io.nuls.consensus.event.BlockHeaderEvent) GetBlockHeaderEvent(io.nuls.consensus.event.GetBlockHeaderEvent) Block(io.nuls.core.chain.entity.Block) BlockHeader(io.nuls.core.chain.entity.BlockHeader)

Example 2 with BlockHeaderEvent

use of io.nuls.consensus.event.BlockHeaderEvent in project nuls by nuls-io.

the class ConsensusMeetingRunner method packing.

private void packing(PocMeetingMember self) throws NulsException, IOException {
    Block bestBlock = context.getBestBlock();
    List<Transaction> txList = txCacheManager.getTxList();
    txList.sort(TxTimeComparator.getInstance());
    BlockData bd = new BlockData();
    bd.setHeight(bestBlock.getHeader().getHeight() + 1);
    bd.setPreHash(bestBlock.getHeader().getHash());
    BlockRoundData roundData = new BlockRoundData();
    roundData.setRoundIndex(consensusManager.getCurrentRound().getIndex());
    roundData.setConsensusMemberCount(consensusManager.getCurrentRound().getMemberCount());
    roundData.setPackingIndexOfRound(self.getIndexOfRound());
    roundData.setRoundStartTime(consensusManager.getCurrentRound().getStartTime());
    bd.setRoundData(roundData);
    List<Integer> outTxList = new ArrayList<>();
    List<NulsDigestData> outHashList = new ArrayList<>();
    List<NulsDigestData> hashList = new ArrayList<>();
    long totalSize = 0L;
    for (int i = 0; i < txList.size(); i++) {
        if ((self.getPackTime() - TimeService.currentTimeMillis()) <= 100) {
            break;
        }
        Transaction tx = txList.get(i);
        totalSize += tx.size();
        if (totalSize >= PocConsensusConstant.MAX_BLOCK_SIZE) {
            break;
        }
        outHashList.add(tx.getHash());
        ValidateResult result = tx.verify();
        if (result.isFailed()) {
            Log.error(result.getMessage());
            outTxList.add(i);
            continue;
        }
        try {
            ledgerService.approvalTx(tx);
        } catch (Exception e) {
            Log.error(e);
            outTxList.add(i);
            continue;
        }
        confirmingTxCacheManager.putTx(tx);
    }
    txCacheManager.removeTx(hashList);
    for (int i = outTxList.size() - 1; i >= 0; i--) {
        txList.remove(i);
    }
    txCacheManager.removeTx(outHashList);
    if (totalSize < PocConsensusConstant.MAX_BLOCK_SIZE) {
        addOrphanTx(txList, totalSize, self);
    }
    addConsensusTx(bestBlock, txList, self);
    bd.setTxList(txList);
    Log.info("txCount:" + txList.size());
    Block newBlock = ConsensusTool.createBlock(bd, consensusManager.getConsensusStatusInfo().getAccount());
    ValidateResult result = newBlock.verify();
    if (result.isFailed()) {
        Log.warn("packing block error:" + result.getMessage());
        for (Transaction tx : newBlock.getTxs()) {
            if (tx.getType() == TransactionConstant.TX_TYPE_COIN_BASE) {
                continue;
            }
            ledgerService.rollbackTx(tx);
        }
        return;
    }
    confirmingTxCacheManager.putTx(newBlock.getTxs().get(0));
    blockManager.addBlock(newBlock, false, null);
    BlockHeaderEvent event = new BlockHeaderEvent();
    event.setEventBody(newBlock.getHeader());
    eventBroadcaster.broadcastAndCache(event, false);
    PackedBlockNotice notice = new PackedBlockNotice();
    notice.setEventBody(newBlock.getHeader());
    eventBroadcaster.publishToLocal(notice);
}
Also used : ValidateResult(io.nuls.core.validate.ValidateResult) NulsException(io.nuls.core.exception.NulsException) IOException(java.io.IOException) NulsRuntimeException(io.nuls.core.exception.NulsRuntimeException) BlockHeaderEvent(io.nuls.consensus.event.BlockHeaderEvent) CoinBaseTransaction(io.nuls.ledger.entity.tx.CoinBaseTransaction) Transaction(io.nuls.core.chain.entity.Transaction) RedPunishTransaction(io.nuls.consensus.entity.tx.RedPunishTransaction) YellowPunishTransaction(io.nuls.consensus.entity.tx.YellowPunishTransaction) BlockRoundData(io.nuls.consensus.entity.block.BlockRoundData) Block(io.nuls.core.chain.entity.Block) NulsDigestData(io.nuls.core.chain.entity.NulsDigestData) PackedBlockNotice(io.nuls.consensus.event.notice.PackedBlockNotice) BlockData(io.nuls.consensus.entity.block.BlockData)

Aggregations

BlockHeaderEvent (io.nuls.consensus.event.BlockHeaderEvent)2 Block (io.nuls.core.chain.entity.Block)2 BlockData (io.nuls.consensus.entity.block.BlockData)1 BlockRoundData (io.nuls.consensus.entity.block.BlockRoundData)1 RedPunishTransaction (io.nuls.consensus.entity.tx.RedPunishTransaction)1 YellowPunishTransaction (io.nuls.consensus.entity.tx.YellowPunishTransaction)1 GetBlockHeaderEvent (io.nuls.consensus.event.GetBlockHeaderEvent)1 PackedBlockNotice (io.nuls.consensus.event.notice.PackedBlockNotice)1 BlockHeader (io.nuls.core.chain.entity.BlockHeader)1 NulsDigestData (io.nuls.core.chain.entity.NulsDigestData)1 Transaction (io.nuls.core.chain.entity.Transaction)1 NulsException (io.nuls.core.exception.NulsException)1 NulsRuntimeException (io.nuls.core.exception.NulsRuntimeException)1 ValidateResult (io.nuls.core.validate.ValidateResult)1 CoinBaseTransaction (io.nuls.ledger.entity.tx.CoinBaseTransaction)1 IOException (java.io.IOException)1