Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }