static void runtest(bool use_testnet, const char *blocks_fn) { const struct chain_info *chain = &chain_metadata[use_testnet ? CHAIN_TESTNET3 : CHAIN_BITCOIN]; struct blkdb blkdb; bu256_t blk0; hex_bu256(&blk0, chain->genesis_hash); assert(blkdb_init(&blkdb, chain->netmagic, &blk0) == true); struct bp_utxo_set uset; bp_utxo_set_init(&uset); fprintf(stderr, "chain-verf: validating %s chainfile %s\n", use_testnet ? "testnet3" : "mainnet", blocks_fn); int fd = open(blocks_fn, O_RDONLY); if (fd < 0) { perror(blocks_fn); assert(fd >= 0); } #if _XOPEN_SOURCE >= 600 || _POSIX_C_SOURCE >= 200112L posix_fadvise(fd, 0, 0, POSIX_FADV_SEQUENTIAL); #endif struct p2p_message msg = {}; bool read_ok = true; int64_t fpos = 0; unsigned int records = 0; while (fread_message(fd, &msg, &read_ok)) { assert(memcmp(msg.hdr.netmagic, chain->netmagic, 4) == 0); read_test_msg(&blkdb, &uset, &msg, fpos); fpos += P2P_HDR_SZ; fpos += msg.hdr.data_len; records++; } assert(read_ok == true); close(fd); free(msg.data); blkdb_free(&blkdb); bp_utxo_set_free(&uset); fprintf(stderr, "chain-verf: %u records validated\n", records); }
static void init_blkdb(void) { if (!blkdb_init(&db, chain->netmagic, &chain_genesis)) { fprintf(plog, "blkdb init failed\n"); exit(1); } char *blkdb_fn = setting("blkdb"); if (!blkdb_fn) return; if ((access(blkdb_fn, F_OK) == 0) && !blkdb_read(&db, blkdb_fn)) { fprintf(plog, "blkdb read failed\n"); exit(1); } db.fd = open(blkdb_fn, O_WRONLY | O_APPEND | O_CREAT | O_LARGEFILE, 0666); if (db.fd < 0) { fprintf(plog, "blkdb file open failed: %s\n", strerror(errno)); exit(1); } }