use of io.nuls.kernel.model.NulsDigestData in project nuls by nuls-io.
the class VMContext method getBlockHeader.
/**
* @param hash
* @return
* @throws NulsException
* @throws IOException
*/
public BlockHeaderDto getBlockHeader(String hash) throws NulsException, IOException {
if (StringUtils.isBlank(hash)) {
return null;
}
NulsDigestData nulsDigestData = NulsDigestData.fromDigestHex(hash);
Result<BlockHeader> blockHeaderResult = blockService.getBlockHeader(nulsDigestData);
if (blockHeaderResult == null || blockHeaderResult.getData() == null) {
return null;
}
BlockHeaderDto header = new BlockHeaderDto(blockHeaderResult.getData());
return header;
}
use of io.nuls.kernel.model.NulsDigestData 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);
}
use of io.nuls.kernel.model.NulsDigestData 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);
}
}
use of io.nuls.kernel.model.NulsDigestData in project nuls by nuls-io.
the class ForwardTxMessageHandler method onMessage.
@Override
public void onMessage(ForwardTxMessage message, Node fromNode) {
if (message == null || fromNode == null || !fromNode.isHandShake() || null == message.getMsgBody()) {
return;
}
NulsDigestData hash = message.getMsgBody();
boolean consains = TransactionDuplicateRemoval.mightContain(hash);
if (consains) {
return;
}
TransactionDuplicateRemoval.insert(hash);
GetTxMessage getTxMessage = new GetTxMessage();
getTxMessage.setMsgBody(hash);
Result result = messageBusService.sendToNode(getTxMessage, fromNode, true);
if (result.isFailed()) {
return;
}
}
use of io.nuls.kernel.model.NulsDigestData 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);
}
Aggregations