//Returns MemoryBlockchainStorage with elements from [splitIndex, blocks.size() - 1].
        //Original SwappedBlockchainStorage will contain elements from [0, splitIndex - 1].

        //Returns MemoryBlockchainStorage with elements from [splitIndex, blocks.size() - 1].
        //Original SwappedBlockchainStorage will contain elements from [0, splitIndex - 1].
        public override std::unique_ptr <BlockchainStorage.IBlockchainStorageInternal> splitStorage(uint splitIndex)
        {
            Debug.Assert(splitIndex > 0);
            Debug.Assert(splitIndex < blocks.size());
            std::unique_ptr <MemoryBlockchainStorage> newStorage = new std::unique_ptr <MemoryBlockchainStorage>(new MemoryBlockchainStorage(new uint(splitIndex)));

            ulong blocksCount = blocks.size();

            for (ulong i = splitIndex; i < blocksCount; ++i)
            {
                newStorage.pushBlock(RawBlock(blocks[i]));
            }

            for (ulong i = 0; i < blocksCount - splitIndex; ++i)
            {
                blocks.pop_back();
            }

            return(std::move(newStorage));
        }