I'd like to know how checkpoints for the monero network are formed and hardcoded in the checkpoint.cpp. Especially when having a fresh fork with the first genesis block having to be made. How to effectively generate the very first checkpoint? From the Monero source code: ```cpp ADD_CHECKPOINT2(1, "771fbcd656ec1464d3a02ead5e18644030007a0fc664c0a964d30922821a8148", "0x2"); ADD_CHECKPOINT2(10, "c0e3b387e47042f72d8ccdca88071ff96bff1ac7cde09ae113dbb7ad3fe92381", "0x2a974"); ADD_CHECKPOINT2(100, "ac3e11ca545e57c49fca2b4e8c48c03c23be047c43e471e1394528b1f9f80b2d", "0x35d14b"); ADD_CHECKPOINT2(1000, "5acfc45acffd2b2e7345caf42fa02308c5793f15ec33946e969e829f40b03876", "0x36a0373"); ADD_CHECKPOINT2(10000, "c758b7c81f928be3295d45e230646de8b852ec96a821eac3fea4daf3fcac0ca2", "0x60a91390"); ``` What are those values? Height, block hash, checksum? How are those created specifically? Additionally, it would be useful to know what effect the `PER_BLOCK_CHECKPOINT` flag has on checkpoints in general. ## Update I figured out the checkpoint consists out of "height", "transaction id" and "cumulative difficulty" and can be received from the daemon via RPC call: ``` curl http://127.0.0.1:18081/json_rpc -d '{"jsonrpc":"2.0","id":"0","method":"get_block_header_by_height","params":{"height":2851000}}' -H 'Content-Type: application/json' ``` But, how can I send this RPC call when the daemon wouldn't pass the first block being validated? ## Update 2 When the database is finally created, the daemon will retrieve the "block hash" of the first block via: ```cpp mdb_block_info* bi = (mdb_block_info*)result.mv_data; crypto::hash ret = bi->bi_hash; ``` The daemon will print an `EXPECTED HASH` and a `GIVEN HASH`, neither of those work in the `checkpoints.cpp`, I guess because this is the hash of the transaction ID?