Search in sources :

Example 1 with Block

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

the class DownloadThreadManager method checkRollback.

private boolean checkRollback(Block localBestBlock, int rollbackCount) throws NulsException {
    if (rollbackCount >= 20) {
        // resetNetwork("number of rollbackTx blocks greater than 10 during download");
        return false;
    }
    List<Node> nodes = newestInfos.getNodes();
    long localHeight = localBestBlock.getHeader().getHeight();
    NulsDigestData localBestHash = localBestBlock.getHeader().getHash();
    for (Node node : nodes) {
        Block block = DownloadUtils.getBlockByHash(localBestHash, node);
        if (block != null && localHeight == block.getHeader().getHeight()) {
            return true;
        }
    }
    if (newestInfos.getNodes().size() > 0) {
        consensusService.rollbackBlock(localBestBlock);
    } else {
        // resetNetwork("the number of available nodes is insufficient for rollbackTx blocks");
        return false;
    }
    localBestBlock = blockService.getBestBlock().getData();
    return checkRollback(localBestBlock, rollbackCount + 1);
}
Also used : Node(io.nuls.network.model.Node) NulsDigestData(io.nuls.kernel.model.NulsDigestData) Block(io.nuls.kernel.model.Block)

Example 2 with Block

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

the class DownloadUtils method getBlockByHash.

public static Block getBlockByHash(NulsDigestData hash, Node node) {
    if (hash == null || node == null) {
        return null;
    }
    GetBlockMessage message = new GetBlockMessage(hash);
    Future<Block> future = ProtocolCacheHandler.addGetBlockByHashRequest(hash);
    Future<NulsDigestData> reactFuture = ProtocolCacheHandler.addRequest(hash);
    Result result = messageBusService.sendToNode(message, node, false);
    // Log.error("start request:"+new Date().toLocaleString()+" ::: "+hash);
    if (!result.isSuccess()) {
        ProtocolCacheHandler.removeBlockByHashFuture(hash);
        ProtocolCacheHandler.removeRequest(hash);
        return null;
    }
    try {
        reactFuture.get(1L, TimeUnit.SECONDS);
        Block block = future.get(30L, TimeUnit.SECONDS);
        return block;
    } catch (Exception e) {
        Log.error(node.getId(), e);
        return null;
    } finally {
        ProtocolCacheHandler.removeBlockByHashFuture(hash);
        ProtocolCacheHandler.removeRequest(hash);
    }
}
Also used : Block(io.nuls.kernel.model.Block) NulsDigestData(io.nuls.kernel.model.NulsDigestData) IOException(java.io.IOException) Result(io.nuls.kernel.model.Result)

Example 3 with Block

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

the class GetBlocksByHashHandler method onMessage.

@Override
public void onMessage(GetBlocksByHashMessage message, Node fromNode) {
    if (message == null || message.getMsgBody() == null || fromNode == null) {
        return;
    }
    GetBlocksByHashParam param = message.getMsgBody();
    if (param.getStartHash() == null || param.getEndHash() == null) {
        return;
    }
    NulsDigestData requestHash = null;
    try {
        requestHash = NulsDigestData.calcDigestData(param.serialize());
    } catch (IOException e) {
        e.printStackTrace();
    }
    // react request
    messageBusService.sendToNode(new ReactMessage(requestHash), fromNode, true);
    BlockHeader startBlockHeader = blockService.getBlockHeader(param.getStartHash()).getData();
    if (startBlockHeader == null) {
        sendNotFound(requestHash, fromNode);
        return;
    }
    Block endBlock = blockService.getBlock(param.getEndHash()).getData();
    if (endBlock == null) {
        sendNotFound(requestHash, fromNode);
        return;
    }
    if (endBlock.getHeader().getHeight() - startBlockHeader.getHeight() >= MAX_SIZE) {
        return;
    }
    Block block = endBlock;
    while (true) {
        sendBlock(block, fromNode);
        if (block.getHeader().getHash().equals(startBlockHeader.getHash())) {
            break;
        }
        Result<Block> result = blockService.getBlock(block.getHeader().getPreHash());
        if (result.isFailed() || (block = result.getData()) == null) {
            sendNotFound(requestHash, fromNode);
            return;
        }
    }
    CompleteMessage completeMessage = new CompleteMessage();
    completeMessage.setMsgBody(new CompleteParam(requestHash, true));
    messageBusService.sendToNode(completeMessage, fromNode, true);
}
Also used : GetBlocksByHashParam(io.nuls.protocol.model.GetBlocksByHashParam) NulsDigestData(io.nuls.kernel.model.NulsDigestData) Block(io.nuls.kernel.model.Block) IOException(java.io.IOException) BlockHeader(io.nuls.kernel.model.BlockHeader) CompleteParam(io.nuls.protocol.model.CompleteParam)

Example 4 with Block

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

the class GetBlockHandler method onMessage.

@Override
public void onMessage(GetBlockMessage message, Node fromNode) {
    if (message == null || message.getMsgBody() == null || fromNode == null) {
        return;
    }
    NulsDigestData blockHash = message.getBlockHash();
    // react request
    messageBusService.sendToNode(new ReactMessage(blockHash), fromNode, true);
    Block block = null;
    Result<Block> result = blockService.getBlock(blockHash);
    if (result.isFailed() || (block = result.getData()) == null) {
        sendNotFound(blockHash, fromNode);
        return;
    }
    sendBlock(block, fromNode);
}
Also used : ReactMessage(io.nuls.protocol.message.ReactMessage) NulsDigestData(io.nuls.kernel.model.NulsDigestData) Block(io.nuls.kernel.model.Block)

Example 5 with Block

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

the class GetBlocksByHeightHandler method onMessage.

@Override
public void onMessage(GetBlocksByHeightMessage message, Node fromNode) {
    if (message == null || message.getMsgBody() == null || fromNode == null) {
        return;
    }
    GetBlocksByHeightParam param = message.getMsgBody();
    if (param.getStartHeight() < 0L || param.getStartHeight() > param.getEndHeight()) {
        return;
    }
    if (param.getEndHeight() - param.getStartHeight() >= MAX_SIZE) {
        return;
    }
    NulsDigestData requestHash = null;
    try {
        requestHash = NulsDigestData.calcDigestData(param.serialize());
    } catch (IOException e) {
        e.printStackTrace();
    }
    // react request
    messageBusService.sendToNode(new ReactMessage(requestHash), fromNode, true);
    Block startBlock = blockService.getBlock(param.getStartHeight()).getData();
    if (startBlock == null) {
        sendNotFound(requestHash, fromNode);
        return;
    }
    // Block endBlock = blockService.getBlock(param.getEndHeight()).getData();
    // if(endBlock == null) {
    // sendNotFound(requestHash, fromNode);
    // return;
    // }
    // 
    // Block block = endBlock;
    // while(true) {
    // sendBlock(block, fromNode);
    // if(block.getHeader().getHash().equals(startBlockHeader.getHash())) {
    // break;
    // }
    // Result<Block> result = blockService.getBlock(block.getHeader().getPreHash());
    // if (result.isFailed() || (block = result.getData()) == null) {
    // sendNotFound(requestHash, fromNode);
    // return;
    // }
    // }
    Block block = startBlock;
    sendBlock(block, fromNode);
    for (long i = param.getStartHeight() + 1; i <= param.getEndHeight(); i++) {
        block = blockService.getBlock(i).getData();
        sendBlock(block, fromNode);
    }
    CompleteMessage completeMessage = new CompleteMessage();
    completeMessage.setMsgBody(new CompleteParam(requestHash, true));
    messageBusService.sendToNode(completeMessage, fromNode, true);
}
Also used : NulsDigestData(io.nuls.kernel.model.NulsDigestData) Block(io.nuls.kernel.model.Block) GetBlocksByHeightParam(io.nuls.protocol.model.GetBlocksByHeightParam) IOException(java.io.IOException) CompleteParam(io.nuls.protocol.model.CompleteParam)

Aggregations

Block (io.nuls.kernel.model.Block)34 NulsDigestData (io.nuls.kernel.model.NulsDigestData)9 Test (org.junit.Test)9 BaseTest (io.nuls.consensus.poc.BaseTest)8 BlockHeader (io.nuls.kernel.model.BlockHeader)8 BlockContainer (io.nuls.consensus.poc.container.BlockContainer)4 ChainContainer (io.nuls.consensus.poc.container.ChainContainer)4 Chain (io.nuls.consensus.poc.model.Chain)4 Result (io.nuls.kernel.model.Result)4 NulsException (io.nuls.kernel.exception.NulsException)3 NulsRuntimeException (io.nuls.kernel.exception.NulsRuntimeException)3 Node (io.nuls.network.model.Node)3 DownloadService (io.nuls.protocol.service.DownloadService)3 IOException (java.io.IOException)3 ArrayList (java.util.ArrayList)3 MicroKernelBootstrap (io.nuls.kernel.MicroKernelBootstrap)2 CompleteParam (io.nuls.protocol.model.CompleteParam)2 SmallBlock (io.nuls.protocol.model.SmallBlock)2 BlockService (io.nuls.protocol.service.BlockService)2 HashSet (java.util.HashSet)2