private bool processBlockHeader(BlockHeader header) { if (lastBlockHeader != null && lastBlockHeader.blockChecksum != null && !header.lastBlockChecksum.SequenceEqual(lastBlockHeader.blockChecksum)) { Logging.warn("TIV: Invalid last block checksum"); // discard the block // TODO require previous block to get verifications from 3 nodes // if in verification mode, detect liar and flag him // below is an implementation that's good enough for now if (minBlockHeightReorg < lastBlockHeader.blockNum - 7) { minBlockHeightReorg = lastBlockHeader.blockNum - 7; } BlockHeader prev_header = BlockHeaderStorage.getBlockHeader(minBlockHeightReorg); if (prev_header == null) { return(false); } lastBlockHeader = prev_header; ConsensusConfig.redactedWindowSize = ConsensusConfig.getRedactedWindowSize(lastBlockHeader.version); ConsensusConfig.minRedactedWindowSize = ConsensusConfig.getRedactedWindowSize(lastBlockHeader.version); return(false); } if (!header.calculateChecksum().SequenceEqual(header.blockChecksum)) { Logging.warn("TIV: Invalid block checksum"); return(false); } lastBlockHeader = header; ConsensusConfig.redactedWindowSize = ConsensusConfig.getRedactedWindowSize(lastBlockHeader.version); ConsensusConfig.minRedactedWindowSize = ConsensusConfig.getRedactedWindowSize(lastBlockHeader.version); if (BlockHeaderStorage.saveBlockHeader(lastBlockHeader)) { // Cleanup every n blocks if ((header.blockNum > CoreConfig.maxBlockHeadersPerDatabase * 25) && header.blockNum % CoreConfig.maxBlockHeadersPerDatabase == 0) { BlockHeaderStorage.removeAllBlocksBefore(header.blockNum - (CoreConfig.maxBlockHeadersPerDatabase * 25)); } } IxianHandler.receivedBlockHeader(lastBlockHeader, true); return(true); }
private bool processBlockHeader(BlockHeader header) { if (lastBlockHeader != null && lastBlockHeader.blockChecksum != null && !header.lastBlockChecksum.SequenceEqual(lastBlockHeader.blockChecksum)) { Logging.warn("TIV: Invalid last block checksum"); // discard the block // require previous block to get verifications from 3 nodes // if in verification mode, detect liar and flag him return(false); } if (!header.calculateChecksum().SequenceEqual(header.blockChecksum)) { Logging.warn("TIV: Invalid block checksum"); return(false); } lastBlockHeader = header; if (!BlockHeaderStorage.saveBlockHeader(lastBlockHeader)) { return(false); } // Cleanup every n blocks if ((header.blockNum > CoreConfig.maxBlockHeadersPerDatabase * 25) && header.blockNum % CoreConfig.maxBlockHeadersPerDatabase == 0) { BlockHeaderStorage.removeAllBlocksBefore(header.blockNum - (CoreConfig.maxBlockHeadersPerDatabase * 25)); } IxianHandler.receivedBlockHeader(lastBlockHeader, true); return(true); }