The "checkpoints" don't come into this at all?
The original question was just copying the /block and /chainstate directories. That is not safe, since there is no checking.
If you use the bootstrap method, then the node reads the blockchain from the bootstrap file as if it was downloaded from the internet. All blocks are checked as normal.
You can also use the -loadblock command.
bitcoind -loadblock=blk00001.dat -loadblock=blk00002.dat ....
I think you have to give them in order.
If you add a block called bootstrap.dat into the data directory, then it is automatically used for bootstrapping.
(I haven't checked the source code myself but have heard conflicting things about the validation of "old blocks")
The checkpoints have 2 effects. If a block at any of the checkpointed heights has the wrong hash, then it is rejected. This means that once a block is checkpointed, core will not accept any chain that doesn't include that block.
The second effect is with signature validation. Core doesn't check signatures until it hits the final checkpoint.
In 0.12, the last checkpointed block is at height 295000. This means that core doesn't check signatures until it hits block 295001. From them on, it checks signatures. The code is
here.
You cannot keep checkpoints and still do the signature checks.