Search in sources :

Example 1 with AssembledBlockNotice

use of io.nuls.consensus.event.notice.AssembledBlockNotice in project nuls by nuls-io.

the class TxGroupHandler method onEvent.

@Override
public void onEvent(TxGroupEvent event, String fromId) {
    TxGroup txGroup = event.getEventBody();
    BlockHeader header = temporaryCacheManager.getBlockHeader(event.getEventBody().getBlockHash().getDigestHex());
    if (header == null) {
        return;
    }
    SmallBlock smallBlock = temporaryCacheManager.getSmallBlock(header.getHash().getDigestHex());
    if (null == smallBlock) {
        return;
    }
    Block block = new Block();
    block.setHeader(header);
    List<Transaction> txs = new ArrayList<>();
    for (NulsDigestData txHash : smallBlock.getTxHashList()) {
        Transaction tx = txCacheManager.getTx(txHash);
        if (null == tx) {
            tx = txGroup.getTx(txHash.getDigestHex());
        }
        if (null == tx) {
            throw new NulsRuntimeException(ErrorCode.DATA_ERROR);
        }
        txs.add(tx);
    }
    block.setTxs(txs);
    ValidateResult<RedPunishData> vResult = block.verify();
    if (null == vResult || (vResult.isFailed() && vResult.getErrorCode() != ErrorCode.ORPHAN_TX)) {
        if (vResult.getLevel() == SeverityLevelEnum.FLAGRANT_FOUL) {
            RedPunishData data = vResult.getObject();
            ConsensusMeetingRunner.putPunishData(data);
            networkService.blackNode(fromId, NodePo.BLACK);
        } else {
            networkService.removeNode(fromId, NodePo.YELLOW);
        }
        return;
    }
    blockManager.addBlock(block, false, fromId);
    downloadDataUtils.removeTxGroup(block.getHeader().getHash().getDigestHex());
    AssembledBlockNotice notice = new AssembledBlockNotice();
    notice.setEventBody(header);
    eventBroadcaster.publishToLocal(notice);
}
Also used : TxGroup(io.nuls.consensus.entity.TxGroup) RedPunishData(io.nuls.consensus.entity.RedPunishData) ArrayList(java.util.ArrayList) NulsRuntimeException(io.nuls.core.exception.NulsRuntimeException) AssembledBlockNotice(io.nuls.consensus.event.notice.AssembledBlockNotice)

Example 2 with AssembledBlockNotice

use of io.nuls.consensus.event.notice.AssembledBlockNotice in project nuls by nuls-io.

the class DownloadDataUtils method requestTxGroup.

public void requestTxGroup(NulsDigestData blockHash, String nodeId) {
    GetTxGroupRequest request = new GetTxGroupRequest();
    GetTxGroupParam data = new GetTxGroupParam();
    data.setBlockHash(blockHash);
    List<NulsDigestData> txHashList = new ArrayList<>();
    SmallBlock smb = temporaryCacheManager.getSmallBlock(blockHash.getDigestHex());
    for (NulsDigestData txHash : smb.getTxHashList()) {
        boolean exist = txCacheManager.txExist(txHash);
        if (!exist) {
            txHashList.add(txHash);
        }
    }
    if (txHashList.isEmpty()) {
        BlockHeader header = temporaryCacheManager.getBlockHeader(smb.getBlockHash().getDigestHex());
        if (null == header) {
            return;
        }
        Block block = new Block();
        block.setHeader(header);
        List<Transaction> txs = new ArrayList<>();
        for (NulsDigestData txHash : smb.getTxHashList()) {
            Transaction tx = txCacheManager.getTx(txHash);
            if (null == tx) {
                throw new NulsRuntimeException(ErrorCode.DATA_ERROR);
            }
            txs.add(tx);
        }
        block.setTxs(txs);
        ValidateResult<RedPunishData> vResult = block.verify();
        if (null == vResult || vResult.isFailed()) {
            if (vResult.getLevel() == SeverityLevelEnum.FLAGRANT_FOUL) {
                RedPunishData redPunishData = vResult.getObject();
                ConsensusMeetingRunner.putPunishData(redPunishData);
            }
            return;
        }
        blockManager.addBlock(block, false, nodeId);
        AssembledBlockNotice notice = new AssembledBlockNotice();
        notice.setEventBody(header);
        eventBroadcaster.publishToLocal(notice);
        return;
    }
    data.setTxHashList(txHashList);
    request.setEventBody(data);
    tgRequest.put(blockHash.getDigestHex(), System.currentTimeMillis());
    Integer value = tgRequestCount.get(blockHash.getDigestHex());
    if (null == value) {
        value = 0;
    }
    tgRequestCount.put(blockHash.getDigestHex(), 1 + value);
    if (StringUtils.isBlank(nodeId)) {
        eventBroadcaster.broadcastAndCache(request, false);
    } else {
        eventBroadcaster.sendToNode(request, nodeId);
    }
}
Also used : GetTxGroupRequest(io.nuls.consensus.event.GetTxGroupRequest) ArrayList(java.util.ArrayList) NulsRuntimeException(io.nuls.core.exception.NulsRuntimeException) RedPunishData(io.nuls.consensus.entity.RedPunishData) GetTxGroupParam(io.nuls.consensus.entity.GetTxGroupParam) AssembledBlockNotice(io.nuls.consensus.event.notice.AssembledBlockNotice)

Aggregations

RedPunishData (io.nuls.consensus.entity.RedPunishData)2 AssembledBlockNotice (io.nuls.consensus.event.notice.AssembledBlockNotice)2 NulsRuntimeException (io.nuls.core.exception.NulsRuntimeException)2 ArrayList (java.util.ArrayList)2 GetTxGroupParam (io.nuls.consensus.entity.GetTxGroupParam)1 TxGroup (io.nuls.consensus.entity.TxGroup)1 GetTxGroupRequest (io.nuls.consensus.event.GetTxGroupRequest)1