public bool AcceptBlock(ref CBlock block)
        {
            uint256 nHash = block.header.Hash;

            if (blockMap.ContainsKey(nHash))
            {
                // Already have this block.
                return false;
            }

            CBlockStoreItem prevBlockCursor;
            if (!blockMap.TryGetValue(block.header.prevHash, out prevBlockCursor))
            {
                // Unable to get the cursor.
                return false;
            }

            var prevBlockHeader = prevBlockCursor.BlockHeader;

            uint nHeight = prevBlockCursor.nHeight + 1;

            // Check timestamp against prev
            if (NetInfo.FutureDrift(block.header.nTime) < prevBlockHeader.nTime)
            {
                // block's timestamp is too early
                return false;
            }

            // Check that all transactions are finalized
            foreach (var tx in block.vtx)
            {
                if (!tx.IsFinal(nHeight, block.header.nTime))
                {
                    return false;
                }
            }

            // Check that the block chain matches the known block chain up to a checkpoint
            if (!HashCheckpoints.Verify(nHeight, nHash))
            {
                return false;  // rejected by checkpoint lock-in
            }

            // Enforce rule that the coinbase starts with serialized block height
            var expect = new CScript();
            expect.AddNumber((int)nHeight);

            byte[] expectBytes = expect;
            byte[] scriptSig = block.vtx[0].vin[0].scriptSig;

            if (!expectBytes.SequenceEqual(scriptSig.Take(expectBytes.Length)))
            {
                return false; // coinbase doesn't start with serialized height.
            }

            // Write block to file.
            var newCursor = new CBlockStoreItem()
            {
                nHeight = nHeight,
            };

            newCursor.FillHeader(block.header);

            if (!AddItemToIndex(ref newCursor, ref block))
            {
                dbConn.Rollback();

                return false;
            }

            return true;
        }