use of neo.model.core.Header in project neo-java by coranos.
the class LocalNodeDataSynchronizedUtil method removeHeadersNotOverBlockIndexUnsynchronized.
/**
* remove headers for blocks where the blocks have already been added to the
* verified block data.
*
* @param localNodeData
* the local node data to update.
* @param blockIndex
* the max blockindex, all headers not over this index should be
* removed.
*/
private static void removeHeadersNotOverBlockIndexUnsynchronized(final LocalNodeData localNodeData, final long blockIndex) {
final SortedSet<Header> unverifiedHeaderPoolSet = localNodeData.getUnverifiedHeaderPoolSet();
LOG.debug("STARTED removeHeadersNotOverBlockIndexUnsynchronized" + " blockIndex:{}; unverifiedHeaderPoolSet.size:{}; ", blockIndex, unverifiedHeaderPoolSet.size());
final Iterator<Header> unverifiedHeaderIt = unverifiedHeaderPoolSet.iterator();
while (unverifiedHeaderIt.hasNext()) {
final Header unverifiedHeader = unverifiedHeaderIt.next();
if (unverifiedHeader.getIndexAsLong() <= blockIndex) {
unverifiedHeaderIt.remove();
}
}
LOG.debug("SUCCESS removeHeadersNotOverBlockIndexUnsynchronized" + " blockIndex:{}; unverifiedHeaderPoolSet.size:{};", blockIndex, unverifiedHeaderPoolSet.size());
}
use of neo.model.core.Header in project neo-java by coranos.
the class LocalNodeDataSynchronizedUtil method requestHeaders.
/**
* request headers from the remote node.
*
* @param localNodeData
* the local node data to use.
* @param remoteNodeData
* the remote node data to use.
*/
public static void requestHeaders(final LocalNodeData localNodeData, final RemoteNodeData remoteNodeData) {
synchronized (localNodeData) {
final UInt256 hashRaw;
final long index;
if (localNodeData.getUnverifiedBlockPoolSet().isEmpty() && (!localNodeData.getVerifiedHeaderPoolMap().isEmpty())) {
final long highestHeaderIndex = localNodeData.getVerifiedHeaderPoolMap().lastKey();
final Header highestHeader = localNodeData.getVerifiedHeaderPoolMap().get(highestHeaderIndex);
LOG.debug("requestHeaders getVerifiedHeaderPoolMap height:{};hash:{};", highestHeaderIndex, highestHeader.hash);
hashRaw = highestHeader.hash;
index = highestHeader.getIndexAsLong();
} else {
final Block highestBlock = localNodeData.getBlockDb().getHeaderOfBlockWithMaxIndex();
if (highestBlock != null) {
LOG.debug("requestHeaders getHighestBlock height:{};hash:{};", highestBlock.getIndexAsLong(), highestBlock.hash);
hashRaw = highestBlock.hash;
index = highestBlock.getIndexAsLong();
} else {
LOG.debug("requestHeaders hash is genesis.");
hashRaw = GenesisBlockUtil.GENESIS_HASH;
index = GenesisBlockUtil.GENESIS_BLOCK.getIndexAsLong();
}
}
final byte[] ba = hashRaw.getBytesCopy();
final UInt256 hash = new UInt256(ba);
LOG.debug("requestHeaders index:{};hash:{};", index, hash);
// fixed bug at height 2000190
// final String goodHashStr =
// "8cb9fee28a48a45468e3c0a229fd4473288cdd9794c10cac7b8f4681ca404342";
// final UInt256 goodHash = new
// UInt256(ByteBuffer.wrap(Hex.decode(goodHashStr)));
// MessageUtil.sendGetHeaders(remoteNodeData, localNodeData, goodHash);
MessageUtil.sendGetHeaders(remoteNodeData, localNodeData, hash);
}
}
use of neo.model.core.Header in project neo-java by coranos.
the class HeadersPayload method toJSONObject.
@Override
public JSONObject toJSONObject() {
final JSONObject json = new JSONObject();
final JSONArray headerListJson = new JSONArray();
json.put("headerList", headerListJson);
for (final Header header : headerList) {
headerListJson.put(header.toJSONObject());
}
return json;
}
use of neo.model.core.Header in project neo-java by coranos.
the class LocalControllerNode method onHeaders.
/**
* does something on a "headers" message.
*
* @param peer
* the peer that sent the message.
* @param message
* the message.
*/
private void onHeaders(final RemoteNodeControllerRunnable peer, final Message message) {
if (stopped) {
return;
}
final HeadersPayload headersPayload = message.getPayload(HeadersPayload.class);
LOG.debug("STARTED onHeaders size:{}", headersPayload.getHeaderList().size());
boolean headerChanged = false;
for (final Header header : headersPayload.getHeaderList()) {
final boolean headerNew = LocalNodeDataSynchronizedUtil.addHeaderIfNew(localNodeData, header);
if (headerNew) {
headerChanged = true;
}
if (!headerNew) {
MapUtil.increment(LocalNodeData.API_CALL_MAP, DUPLICATE_IN_HEADER);
}
}
LOG.debug("INTERIM onHeaders headerChanged:{}", headerChanged);
if (headerChanged) {
LocalNodeDataSynchronizedUtil.verifyUnverifiedHeaders(localNodeData);
notifyNodeDataChangeListeners();
} else {
MapUtil.increment(LocalNodeData.API_CALL_MAP, IN_HEADERS_ALL_DUPLICATES);
LOG.debug("header message received with {} headers, but all were duplicates.", headersPayload.getHeaderList().size());
}
LOG.debug("SUCCESS onHeaders headerChanged:{}", headerChanged);
}
use of neo.model.core.Header in project neo-java by coranos.
the class LocalNodeDataSynchronizedUtil method verifyUnverifiedHeaders.
/**
* verify any unverified headers, by checking if their block height is less than
* the max block height in the blockchain.
*
* @param localNodeData
* the local node data to use.
* @return true if any block was added to the chain.
*/
public static boolean verifyUnverifiedHeaders(final LocalNodeData localNodeData) {
synchronized (localNodeData) {
LOG.debug("STARTED verifyUnverifiedHeaders");
boolean anyHeaderChanged = false;
final Block highestBlock = localNodeData.getBlockDb().getHeaderOfBlockWithMaxIndex();
final UInt256 highestBlockHash;
final long highestBlockIndex;
if (highestBlock == null) {
highestBlockHash = GenesisBlockUtil.GENESIS_HASH;
highestBlockIndex = 0;
} else {
highestBlockHash = highestBlock.hash;
highestBlockIndex = highestBlock.getIndexAsLong();
}
removeHeadersNotOverBlockIndexUnsynchronized(localNodeData, highestBlockIndex);
final Iterator<Header> unverifiedHeaderIt = localNodeData.getUnverifiedHeaderPoolSet().iterator();
while (unverifiedHeaderIt.hasNext()) {
final Header unverifiedHeader = unverifiedHeaderIt.next();
if (LOG.isTraceEnabled()) {
LOG.trace("INTERIM verifyUnverifiedHeaders, unverifiedHeader index:{};hash:{}; VerifiedHeaderPoolMap.isEmpty:{};", unverifiedHeader.getIndexAsLong(), unverifiedHeader.hash, localNodeData.getVerifiedHeaderPoolMap().isEmpty());
}
if (localNodeData.getVerifiedHeaderPoolMap().isEmpty()) {
if (LOG.isTraceEnabled()) {
final String message = "INTERIM verifyUnverifiedHeaders[1]," + " unverifiedHeader index:{};hash:{};prevHash:{}; highestBlock index:{};hash:{};";
LOG.trace(message, unverifiedHeader.getIndexAsLong(), unverifiedHeader.hash, unverifiedHeader.prevHash, highestBlockIndex, highestBlockHash);
}
if (unverifiedHeader.prevHash.equals(highestBlockHash)) {
localNodeData.getVerifiedHeaderPoolMap().put(unverifiedHeader.getIndexAsLong(), unverifiedHeader);
unverifiedHeaderIt.remove();
anyHeaderChanged = true;
if (LOG.isTraceEnabled()) {
final String message = "SUCCESS verifyUnverifiedHeaders[1]," + " unverifiedHeader index:{};hash:{};prevHash:{};";
LOG.trace(message, unverifiedHeader.getIndexAsLong(), unverifiedHeader.hash, unverifiedHeader.prevHash);
}
} else {
if (LOG.isTraceEnabled()) {
final String message = "FAILURE verifyUnverifiedHeaders[2]," + " unverifiedHeader index:{};hash:{};prevHash:{};highestBlockHash:{};";
LOG.trace(message, unverifiedHeader.getIndexAsLong(), unverifiedHeader.hash, unverifiedHeader.prevHash, highestBlockHash);
}
}
} else {
final long verifiedHeaderHeight = localNodeData.getVerifiedHeaderPoolMap().lastKey();
final Header verifiedHeader = localNodeData.getVerifiedHeaderPoolMap().get(verifiedHeaderHeight);
if (LOG.isTraceEnabled()) {
final String message = "INTERIM verifyUnverifiedHeaders[2]," + " unverifiedHeader index:{};hash:{};prevHash:{}; verifiedHeader index:{};hash:{};";
LOG.trace(message, unverifiedHeader.getIndexAsLong(), unverifiedHeader.hash, unverifiedHeader.prevHash, verifiedHeaderHeight, verifiedHeader.hash);
}
if (unverifiedHeader.prevHash.equals(verifiedHeader.hash)) {
localNodeData.getVerifiedHeaderPoolMap().put(unverifiedHeader.getIndexAsLong(), unverifiedHeader);
unverifiedHeaderIt.remove();
anyHeaderChanged = true;
if (LOG.isTraceEnabled()) {
LOG.trace("SUCCESS verifyUnverifiedHeaders, unverifiedHeader index:{};hash:{};prevHash:{};", unverifiedHeader.getIndexAsLong(), unverifiedHeader.hash, unverifiedHeader.prevHash);
}
} else {
if (LOG.isTraceEnabled()) {
LOG.trace("FAILURE verifyUnverifiedHeaders, unverifiedHeader index:{};hash:{};prevHash:{};", unverifiedHeader.getIndexAsLong(), unverifiedHeader.hash, unverifiedHeader.prevHash);
}
}
}
}
LOG.debug("SUCCESS verifyUnverifiedHeaders, anyHeaderChanged:{};", anyHeaderChanged);
return anyHeaderChanged;
}
}
Aggregations