Search in sources :

Example 1 with Header

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());
}
Also used : Header(neo.model.core.Header)

Example 2 with Header

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);
    }
}
Also used : Header(neo.model.core.Header) Block(neo.model.core.Block) UInt256(neo.model.bytes.UInt256)

Example 3 with Header

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;
}
Also used : JSONObject(org.json.JSONObject) Header(neo.model.core.Header) JSONArray(org.json.JSONArray)

Example 4 with Header

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);
}
Also used : Header(neo.model.core.Header) HeadersPayload(neo.model.network.HeadersPayload)

Example 5 with Header

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;
    }
}
Also used : Header(neo.model.core.Header) Block(neo.model.core.Block) UInt256(neo.model.bytes.UInt256)

Aggregations

Header (neo.model.core.Header)7 UInt256 (neo.model.bytes.UInt256)3 Block (neo.model.core.Block)2 JSONObject (org.json.JSONObject)2 ArrayList (java.util.ArrayList)1 Entry (java.util.Map.Entry)1 HeadersPayload (neo.model.network.HeadersPayload)1 JSONArray (org.json.JSONArray)1 Test (org.junit.Test)1