Post
Topic
Board Announcements (Altcoins)
Re: [ANN][CLAM] CLAMS, Proof-Of-Chain, Proof-Of-Pearl, Recent Mandatory Update
by
dooglus
on 26/06/2015, 17:17:21 UTC
I regularly update this old post with full dumps of the CLAM blockchain in bootstrap.dat format to make it easier for people to get their CLAM client synced up:

I made an updated bootstrap.dat file for people having trouble syncing their client.

It goes up to block 526400 which was staked on Thu Jun 25 05:07:28 2015.

https://s3.amazonaws.com/dooglus/bootstrap.dat

Last night in the Just-Dice chat, Thirdspace asked about the possibility of generating and syncing from "partial" bootstrap.dat files. Suppose your client went out of sync a few weeks ago and is 20,000 blocks behind. You don't want to download and import the whole bootstrap.dat file because you already have 95% of it. Is there some way of having someone make a bootstrap.dat file with just the blocks you need?

Well, the bootstrap file format is very simple: it's pretty much just the raw block data. There's no reason it has to start at block 0. So I made a commit to the CLAM client repository allowing you to run 'dumpbootstrap' and tell it which block to start the dump from. And since I had a bunch of .clam folders ready to go, I tested it:

Quote
$ cc1 getblockcount
528105

$ cc2 getblockcount
527194

$ cc1 dumpbootstrap /tmp 527200 527190

$ cp /tmp/bootstrap.dat ~/.clam.bs2/

$ cc2 stop
Clam server stopping

$ cc2
Clam server starting

$ cc2 getblockcount
527200

ie. I have two clamd processes running. One is up to date and one is behind (and not connected to any peers). I create an 11-block bootstrap from the up to date clamd, copy it into the out of date clamd's date folder, restart, and see that it has successfully imported just those blocks. The 11 block bootstrap file was just 10642 bytes long.

So I'll publish 10k block bootstrap files, along with the big one. If you're 30k blocks behind, you can simply download the last three, append them all together in order (the format is simple enough that you can stick them end to end without breaking anything) and restart the client.

See the old bootstrap.dat post for details of how to find the 10k block bootstrap files.

Edit: presstab replied, then apparently deleted his reply. He made the point that there's no harm using a full bootstrap.dat file, because it will quickly skip the blocks you already have, and the only advantage of partial bootstrap files is they're smaller.

I was curious to know how long it takes to skip through a bootstrap file you've already imported, so I tried it:

Quote
2015-06-26 20:29:38 ERROR: ProcessBlock() : already have block 0 00000c3ce6b3d823a35224a39798eca9ad889966aeb5a9da7b960ffb9869db35
2015-06-26 20:29:56 ERROR: ProcessBlock() : already have block 10000 00000de398b1ec72c393c5c54574a1e1784eb178d683e1ad0856c12fac34f603
2015-06-26 20:30:09 ERROR: ProcessBlock() : already have block 20000 e83f9c8d6f07222274e4a7105437ac2d297455f6b19f77766e8c528356283677
2015-06-26 20:30:22 ERROR: ProcessBlock() : already have block 30000 9c2c63f73c2134642bfe03dc4d6a53474f9f4d92395584d80b47dda52d1b37c0
2015-06-26 20:30:36 ERROR: ProcessBlock() : already have block 40000 7de664887740f7c3cb3ae194f911371a45e3ca2b022066a2da297d6c0365fa3b
2015-06-26 20:30:49 ERROR: ProcessBlock() : already have block 50000 5de01a261d21fbe84d75f9fbc62e6f09d2ec2d560a8a811e80c9bef2272c365b
2015-06-26 20:31:02 ERROR: ProcessBlock() : already have block 60000 d33bac1acd3cc8755011b982821e6c466cd6dbb7c3a0ad773e823d9fe32e12e2
2015-06-26 20:31:16 ERROR: ProcessBlock() : already have block 70000 4abb43132303df920a01fbea577ee36ba9f008133b59fb1ca98b20d7a8e7c49b
2015-06-26 20:31:29 ERROR: ProcessBlock() : already have block 80000 cd214e98efce27a727f1d916d6ef4219fc7c7c1044b4a244c7c556003171a783
2015-06-26 20:31:42 ERROR: ProcessBlock() : already have block 90000 ebb678b09629ae0657500521b73aafd4fa66f441458a14c70380c0ca05eccfbb
2015-06-26 20:31:56 ERROR: ProcessBlock() : already have block 100000 41148b9796e65ddbefea175f6372b2448fc2f6b22b66da64fc3a15d29c8ed843
2015-06-26 20:32:09 ERROR: ProcessBlock() : already have block 110000 26f975554ddc28ccac35b0dd831fa4e50178cfaca9c1426d262d1a2636510287
2015-06-26 20:32:23 ERROR: ProcessBlock() : already have block 120000 3d61e782261ea8e8636baa54f5436ac46780def46faf37a4a4f3d9f0459e1e56
2015-06-26 20:32:36 ERROR: ProcessBlock() : already have block 130000 d5dd5c72d35cb1d09a5551e8f3ef108bd33a798797100010886d63d3318f8608
2015-06-26 20:32:49 ERROR: ProcessBlock() : already have block 140000 f02386088eeeee7f88a9d5c1173550c24675936fdfc1354920e95022f4b3ec9e
2015-06-26 20:33:03 ERROR: ProcessBlock() : already have block 150000 d4ae18d81d6e4dc58aeab94c37cab4479db579ac7a735f6a214f982898dc1bbd
2015-06-26 20:33:16 ERROR: ProcessBlock() : already have block 160000 d8da7a1012e115a917baaaa55c8881cad1e38a40711b26b4db0430b08f60203d
2015-06-26 20:33:29 ERROR: ProcessBlock() : already have block 170000 28e44f6c55de5a7bb5ffb81b25038b97f9009a751802d34311198ed0b6ce17bb
2015-06-26 20:33:43 ERROR: ProcessBlock() : already have block 180000 c6f6d4c917a07fbdb778e752ad54d99a6b0f8f9e93bfc70a1ec4706ee1e4d21d
2015-06-26 20:33:56 ERROR: ProcessBlock() : already have block 190000 e9039de1956ab6c6c4556ba4b9687238c8c8bfcb5122aed7398e09e2dfca0783
2015-06-26 20:34:09 ERROR: ProcessBlock() : already have block 200000 5d1d35993e9867d1feb906030bb611de87f4d8ff48b9228044ef892cc87a7916
2015-06-26 20:34:15 ERROR: ProcessBlock() : already have block 210000 077e174e1452dcd93b39a318328bb001ef269d0789d22bfe9bfb260220f8f34f
2015-06-26 20:34:17 ERROR: ProcessBlock() : already have block 220000 5e5ceccff284fb41b4cb86b3e105c820517d320bc35f0d860fef55567cc89742
2015-06-26 20:34:18 ERROR: ProcessBlock() : already have block 230000 694757c71807298f685a14be01d787bde0f30b358a84cf34d10682368f411d7d
2015-06-26 20:34:19 ERROR: ProcessBlock() : already have block 240000 745ffb8c625ccde5b1255a4d17bd7ad44f2726eccfe022385c4e0960b6e2f38f
2015-06-26 20:34:22 ERROR: ProcessBlock() : already have block 250000 b560c121438f630401c102767587b70cb0cc7d1e0c09114dd0b91455262aa64c
2015-06-26 20:34:23 ERROR: ProcessBlock() : already have block 260000 b607a404deff7620e182a47e04ff0abd5ba3883c0b1a3b1bed011b6efdf3f854
2015-06-26 20:34:25 ERROR: ProcessBlock() : already have block 270000 a86fe2bafcb03de4b81ee8d0069f1c50cf88e7c29fe42499f35501baa840f485
2015-06-26 20:34:26 ERROR: ProcessBlock() : already have block 280000 446536d0327978d29ebecba383c6fdfc641db6f79241149d7c4c0cc2ffb37b03
2015-06-26 20:34:28 ERROR: ProcessBlock() : already have block 290000 4b57107940c668008dd36cc79cb97e4e1a3a3a6ae68b1c21885de3389838c0bf
2015-06-26 20:34:30 ERROR: ProcessBlock() : already have block 300000 144de2a2169e1a98e0b121bfdd7cdee6192dba71c10cde65e785e39f00f05c2b
2015-06-26 20:34:32 ERROR: ProcessBlock() : already have block 310000 78229e2d02dd8a62b3429ef4aa6db5d80870cc7b576528621d213b01aeb14625
2015-06-26 20:34:34 ERROR: ProcessBlock() : already have block 320000 71832dd669399489b46c174d8b9a30ab15ae9cbbb5bd9d42355ce6e91dd93058
2015-06-26 20:34:36 ERROR: ProcessBlock() : already have block 330000 65488e8a49540893fc47eb2a46ce81d1e67fa264a89a2efc5dc51b8d0cc8cb16
2015-06-26 20:34:37 ERROR: ProcessBlock() : already have block 340000 cb56b08807ec3d4e0615f0c622edbb803afddbf3895b21081a325910af0ebf07
2015-06-26 20:34:39 ERROR: ProcessBlock() : already have block 350000 55cc97c7ea1159273b4c600d358a782afd2134960a0ff6163685a4254ef2b4ed
2015-06-26 20:34:42 ERROR: ProcessBlock() : already have block 360000 8d7b4acad066bde560de850c4f26153be9b20f705b59105337de32b85b0f1a87
2015-06-26 20:34:44 ERROR: ProcessBlock() : already have block 370000 f1c5288956ab526197a1b59f03e6678fe6575911c3f0199aaf678206bebc80cf
2015-06-26 20:34:46 ERROR: ProcessBlock() : already have block 380000 6504aeac0d9c232dc7617d7d87cb6e66f94c15264feffff37a28a186cf2c500f
2015-06-26 20:34:48 ERROR: ProcessBlock() : already have block 390000 7ef1f3be4f9aac3351e72df28851c1bd3d3d84b9f81c6ef896a1b46e42ef2d67
2015-06-26 20:34:51 ERROR: ProcessBlock() : already have block 400000 6ec2869889333270e1eb549bfe5d19b6423ad8b36a05807a71d2301accfadf0b
2015-06-26 20:34:53 ERROR: ProcessBlock() : already have block 410000 0d2ab2ac4e5de4736d0936099782003eff643a245481be430bd1068536220459
2015-06-26 20:34:54 ERROR: ProcessBlock() : already have block 420000 9b1f78bce2c9231e81dcd1fabfa5170f7e62de9d7b328e1e93bbb1c4891852f9
2015-06-26 20:34:57 ERROR: ProcessBlock() : already have block 430000 2c50e406397898689e2d22d75a2a9fea7b3d01439529296904cd81c6f14d3674
2015-06-26 20:34:59 ERROR: ProcessBlock() : already have block 440000 249a244d1fbecd83ac132b78c525b68df34747cefddfc9923f9e79eebe09ade9
2015-06-26 20:35:01 ERROR: ProcessBlock() : already have block 450000 63e383c62d7a2c2dc14b1d83f824dadad28f3eda91e45e6aa8ba57b8af96e07e
2015-06-26 20:35:03 ERROR: ProcessBlock() : already have block 460000 57981293949874d9d059c9dfa3cd34c08edd3a628f3e2250cea6a5d87bddaeb5
2015-06-26 20:35:05 ERROR: ProcessBlock() : already have block 470000 e1a62fa91ab92d771874530388c3ada97461796d7947e253519c8cf3323ea80b
2015-06-26 20:35:08 ERROR: ProcessBlock() : already have block 480000 39f9b9e801e37502fc512eb6dfbbc11a76d0c74c5e9ff6eff0c2d2826baff199
2015-06-26 20:35:10 ERROR: ProcessBlock() : already have block 490000 f95c855c2595540424e812897b7338e2e201ddedaee48c955326bce2effffcdd
2015-06-26 20:35:12 ERROR: ProcessBlock() : already have block 500000 af388da4175404ebac7be210e1ed092e4e283d167505db617f009d9bc56f42fc
2015-06-26 20:35:14 ERROR: ProcessBlock() : already have block 510000 2d02bfe474e62c90f5ef54a9014d00102397fa9afe6f7f8cd0794dc415ba147e
2015-06-26 20:35:15 ERROR: ProcessBlock() : already have block 520000 3488d2266f497a49b3ac09f98b36fff94b732fde21e597b0ca5b6ea8afaf66d3

It was taking 13 seconds per 10000 blocks up until around block 200k, and then it got much much faster. Why would that be? What happened around there?

I repeated the test to see if it would happen the same way, and it did:

Quote
2015-06-26 20:36:06 ERROR: ProcessBlock() : already have block 0 00000c3ce6b3d823a35224a39798eca9ad889966aeb5a9da7b960ffb9869db35
2015-06-26 20:36:23 ERROR: ProcessBlock() : already have block 10000 00000de398b1ec72c393c5c54574a1e1784eb178d683e1ad0856c12fac34f603
2015-06-26 20:36:37 ERROR: ProcessBlock() : already have block 20000 e83f9c8d6f07222274e4a7105437ac2d297455f6b19f77766e8c528356283677
2015-06-26 20:36:51 ERROR: ProcessBlock() : already have block 30000 9c2c63f73c2134642bfe03dc4d6a53474f9f4d92395584d80b47dda52d1b37c0
2015-06-26 20:37:04 ERROR: ProcessBlock() : already have block 40000 7de664887740f7c3cb3ae194f911371a45e3ca2b022066a2da297d6c0365fa3b
2015-06-26 20:37:17 ERROR: ProcessBlock() : already have block 50000 5de01a261d21fbe84d75f9fbc62e6f09d2ec2d560a8a811e80c9bef2272c365b
2015-06-26 20:37:31 ERROR: ProcessBlock() : already have block 60000 d33bac1acd3cc8755011b982821e6c466cd6dbb7c3a0ad773e823d9fe32e12e2
2015-06-26 20:37:45 ERROR: ProcessBlock() : already have block 70000 4abb43132303df920a01fbea577ee36ba9f008133b59fb1ca98b20d7a8e7c49b
2015-06-26 20:37:58 ERROR: ProcessBlock() : already have block 80000 cd214e98efce27a727f1d916d6ef4219fc7c7c1044b4a244c7c556003171a783
2015-06-26 20:38:12 ERROR: ProcessBlock() : already have block 90000 ebb678b09629ae0657500521b73aafd4fa66f441458a14c70380c0ca05eccfbb
2015-06-26 20:38:26 ERROR: ProcessBlock() : already have block 100000 41148b9796e65ddbefea175f6372b2448fc2f6b22b66da64fc3a15d29c8ed843
2015-06-26 20:38:39 ERROR: ProcessBlock() : already have block 110000 26f975554ddc28ccac35b0dd831fa4e50178cfaca9c1426d262d1a2636510287
2015-06-26 20:38:52 ERROR: ProcessBlock() : already have block 120000 3d61e782261ea8e8636baa54f5436ac46780def46faf37a4a4f3d9f0459e1e56
2015-06-26 20:39:06 ERROR: ProcessBlock() : already have block 130000 d5dd5c72d35cb1d09a5551e8f3ef108bd33a798797100010886d63d3318f8608
2015-06-26 20:39:19 ERROR: ProcessBlock() : already have block 140000 f02386088eeeee7f88a9d5c1173550c24675936fdfc1354920e95022f4b3ec9e
2015-06-26 20:39:33 ERROR: ProcessBlock() : already have block 150000 d4ae18d81d6e4dc58aeab94c37cab4479db579ac7a735f6a214f982898dc1bbd
2015-06-26 20:39:47 ERROR: ProcessBlock() : already have block 160000 d8da7a1012e115a917baaaa55c8881cad1e38a40711b26b4db0430b08f60203d
2015-06-26 20:40:00 ERROR: ProcessBlock() : already have block 170000 28e44f6c55de5a7bb5ffb81b25038b97f9009a751802d34311198ed0b6ce17bb
2015-06-26 20:40:14 ERROR: ProcessBlock() : already have block 180000 c6f6d4c917a07fbdb778e752ad54d99a6b0f8f9e93bfc70a1ec4706ee1e4d21d
2015-06-26 20:40:27 ERROR: ProcessBlock() : already have block 190000 e9039de1956ab6c6c4556ba4b9687238c8c8bfcb5122aed7398e09e2dfca0783
2015-06-26 20:40:41 ERROR: ProcessBlock() : already have block 200000 5d1d35993e9867d1feb906030bb611de87f4d8ff48b9228044ef892cc87a7916
2015-06-26 20:40:46 ERROR: ProcessBlock() : already have block 210000 077e174e1452dcd93b39a318328bb001ef269d0789d22bfe9bfb260220f8f34f
2015-06-26 20:40:48 ERROR: ProcessBlock() : already have block 220000 5e5ceccff284fb41b4cb86b3e105c820517d320bc35f0d860fef55567cc89742
2015-06-26 20:40:49 ERROR: ProcessBlock() : already have block 230000 694757c71807298f685a14be01d787bde0f30b358a84cf34d10682368f411d7d
2015-06-26 20:40:51 ERROR: ProcessBlock() : already have block 240000 745ffb8c625ccde5b1255a4d17bd7ad44f2726eccfe022385c4e0960b6e2f38f
2015-06-26 20:40:53 ERROR: ProcessBlock() : already have block 250000 b560c121438f630401c102767587b70cb0cc7d1e0c09114dd0b91455262aa64c
2015-06-26 20:40:55 ERROR: ProcessBlock() : already have block 260000 b607a404deff7620e182a47e04ff0abd5ba3883c0b1a3b1bed011b6efdf3f854
2015-06-26 20:40:56 ERROR: ProcessBlock() : already have block 270000 a86fe2bafcb03de4b81ee8d0069f1c50cf88e7c29fe42499f35501baa840f485
2015-06-26 20:40:58 ERROR: ProcessBlock() : already have block 280000 446536d0327978d29ebecba383c6fdfc641db6f79241149d7c4c0cc2ffb37b03
2015-06-26 20:40:59 ERROR: ProcessBlock() : already have block 290000 4b57107940c668008dd36cc79cb97e4e1a3a3a6ae68b1c21885de3389838c0bf
2015-06-26 20:41:01 ERROR: ProcessBlock() : already have block 300000 144de2a2169e1a98e0b121bfdd7cdee6192dba71c10cde65e785e39f00f05c2b
2015-06-26 20:41:03 ERROR: ProcessBlock() : already have block 310000 78229e2d02dd8a62b3429ef4aa6db5d80870cc7b576528621d213b01aeb14625
2015-06-26 20:41:04 ERROR: ProcessBlock() : already have block 320000 71832dd669399489b46c174d8b9a30ab15ae9cbbb5bd9d42355ce6e91dd93058
2015-06-26 20:41:06 ERROR: ProcessBlock() : already have block 330000 65488e8a49540893fc47eb2a46ce81d1e67fa264a89a2efc5dc51b8d0cc8cb16
2015-06-26 20:41:08 ERROR: ProcessBlock() : already have block 340000 cb56b08807ec3d4e0615f0c622edbb803afddbf3895b21081a325910af0ebf07
2015-06-26 20:41:10 ERROR: ProcessBlock() : already have block 350000 55cc97c7ea1159273b4c600d358a782afd2134960a0ff6163685a4254ef2b4ed
2015-06-26 20:41:12 ERROR: ProcessBlock() : already have block 360000 8d7b4acad066bde560de850c4f26153be9b20f705b59105337de32b85b0f1a87
2015-06-26 20:41:14 ERROR: ProcessBlock() : already have block 370000 f1c5288956ab526197a1b59f03e6678fe6575911c3f0199aaf678206bebc80cf
2015-06-26 20:41:16 ERROR: ProcessBlock() : already have block 380000 6504aeac0d9c232dc7617d7d87cb6e66f94c15264feffff37a28a186cf2c500f
2015-06-26 20:41:18 ERROR: ProcessBlock() : already have block 390000 7ef1f3be4f9aac3351e72df28851c1bd3d3d84b9f81c6ef896a1b46e42ef2d67
2015-06-26 20:41:20 ERROR: ProcessBlock() : already have block 400000 6ec2869889333270e1eb549bfe5d19b6423ad8b36a05807a71d2301accfadf0b
2015-06-26 20:41:22 ERROR: ProcessBlock() : already have block 410000 0d2ab2ac4e5de4736d0936099782003eff643a245481be430bd1068536220459
2015-06-26 20:41:24 ERROR: ProcessBlock() : already have block 420000 9b1f78bce2c9231e81dcd1fabfa5170f7e62de9d7b328e1e93bbb1c4891852f9
2015-06-26 20:41:27 ERROR: ProcessBlock() : already have block 430000 2c50e406397898689e2d22d75a2a9fea7b3d01439529296904cd81c6f14d3674
2015-06-26 20:41:29 ERROR: ProcessBlock() : already have block 440000 249a244d1fbecd83ac132b78c525b68df34747cefddfc9923f9e79eebe09ade9
2015-06-26 20:41:31 ERROR: ProcessBlock() : already have block 450000 63e383c62d7a2c2dc14b1d83f824dadad28f3eda91e45e6aa8ba57b8af96e07e
2015-06-26 20:41:33 ERROR: ProcessBlock() : already have block 460000 57981293949874d9d059c9dfa3cd34c08edd3a628f3e2250cea6a5d87bddaeb5
2015-06-26 20:41:35 ERROR: ProcessBlock() : already have block 470000 e1a62fa91ab92d771874530388c3ada97461796d7947e253519c8cf3323ea80b
2015-06-26 20:41:37 ERROR: ProcessBlock() : already have block 480000 39f9b9e801e37502fc512eb6dfbbc11a76d0c74c5e9ff6eff0c2d2826baff199
2015-06-26 20:41:39 ERROR: ProcessBlock() : already have block 490000 f95c855c2595540424e812897b7338e2e201ddedaee48c955326bce2effffcdd
2015-06-26 20:41:41 ERROR: ProcessBlock() : already have block 500000 af388da4175404ebac7be210e1ed092e4e283d167505db617f009d9bc56f42fc
2015-06-26 20:41:42 ERROR: ProcessBlock() : already have block 510000 2d02bfe474e62c90f5ef54a9014d00102397fa9afe6f7f8cd0794dc415ba147e
2015-06-26 20:41:44 ERROR: ProcessBlock() : already have block 520000 3488d2266f497a49b3ac09f98b36fff94b732fde21e597b0ca5b6ea8afaf66d3

tldr: it takes about 6 minutes, but skips the 2nd half much faster than the 1st half.

Edit: it's not because the blocks are smaller that they are skipped more quickly. If anything they're bigger:

Quote
113973730 bootstrap-000.dat
  4773168 bootstrap-001.dat
  4493088 bootstrap-002.dat
  5541516 bootstrap-003.dat
  4872122 bootstrap-004.dat
  4408922 bootstrap-005.dat
  7284141 bootstrap-006.dat
  4637522 bootstrap-007.dat
  4392465 bootstrap-008.dat
  4438838 bootstrap-009.dat
  4258087 bootstrap-010.dat
  4304484 bootstrap-011.dat
  4272753 bootstrap-012.dat
  4283469 bootstrap-013.dat
  4584873 bootstrap-014.dat
  4310057 bootstrap-015.dat
  4652678 bootstrap-016.dat
  4416905 bootstrap-017.dat
  4238363 bootstrap-018.dat
  4236413 bootstrap-019.dat
  4355254 bootstrap-020.dat
  5830952 bootstrap-021.dat
  4930082 bootstrap-022.dat
  4854884 bootstrap-023.dat
 17798965 bootstrap-024.dat
  7117526 bootstrap-025.dat
  6036061 bootstrap-026.dat
  7176316 bootstrap-027.dat
 11303056 bootstrap-028.dat
  9329719 bootstrap-029.dat
  7952169 bootstrap-030.dat
  7027990 bootstrap-031.dat
  8260798 bootstrap-032.dat
  7720261 bootstrap-033.dat
  9812284 bootstrap-034.dat
 17565304 bootstrap-035.dat
 12039460 bootstrap-036.dat
 12940822 bootstrap-037.dat
 14238319 bootstrap-038.dat
 14080726 bootstrap-039.dat
 13556671 bootstrap-040.dat
 11211604 bootstrap-041.dat
 23640962 bootstrap-042.dat
 10525737 bootstrap-043.dat
 10998702 bootstrap-044.dat
 10741589 bootstrap-045.dat
 15336451 bootstrap-046.dat
 15650616 bootstrap-047.dat
 10236644 bootstrap-048.dat
 10454751 bootstrap-049.dat
  8864684 bootstrap-050.dat
  8427256 bootstrap-051.dat

Maybe this is a clue?

Quote
inline bool IsProtocolV2(int nHeight) { return nHeight > 203500; }

Edit: ok, case solved:

Quote
   uint256 GetHash() const
    {
        if (nVersion > 6)
            return Hash(BEGIN(nVersion), END(nNonce));
        else
            return GetPoWHash();
    }

    uint256 GetPoWHash() const
    {
        return scrypt_blockhash(CVOIDBEGIN(nVersion));
    }

To tell whether we already have a block we find in a bootstrap file, we hash it and see if we have a block with that hash. Before block 203501 blocks were hashed using scrypt, which is designed to be slow. After block 203500 we switched to sha256 which is fast. Notice how blocks 0 and 10000 have hashes that start with a lot of zeroes - that's because they were proof-of-work blocks.

Quote
$ for i in bootstrap-0[12]?.dat; do echo $i $(od -An -t x1 $i | head -1 | awk '{print $9}'); done
bootstrap-010.dat 06
bootstrap-011.dat 06
bootstrap-012.dat 06
bootstrap-013.dat 06
bootstrap-014.dat 06
bootstrap-015.dat 06
bootstrap-016.dat 06
bootstrap-017.dat 06
bootstrap-018.dat 06
bootstrap-019.dat 06
bootstrap-020.dat 06
bootstrap-021.dat 07
bootstrap-022.dat 07
bootstrap-023.dat 07
bootstrap-024.dat 07
bootstrap-025.dat 07
bootstrap-026.dat 07
bootstrap-027.dat 07
bootstrap-028.dat 07
bootstrap-029.dat 07