From 2a292786a6dd6156be724363708ddd97b9e0ae38 Mon Sep 17 00:00:00 2001 From: edtubbs Date: Thu, 16 May 2024 13:21:59 -0500 Subject: [PATCH] headersdb_file: added chainwork to database record headersdb_file: added chainwork to load and write headersdb_file: added chainwork check on write headersdb_file: updated current version for chainwork --- src/headersdb_file.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/headersdb_file.c b/src/headersdb_file.c index 993ae474c..7af06f934 100644 --- a/src/headersdb_file.c +++ b/src/headersdb_file.c @@ -37,7 +37,7 @@ #include static const unsigned char file_hdr_magic[4] = {0xA8, 0xF0, 0x11, 0xC5}; /* header magic */ -static const uint32_t current_version = 2; +static const uint32_t current_version = 3; /* 3: added chainwork */ /** * "Compare two block headers by their hashes." @@ -217,7 +217,7 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file fflush(stdout); } - uint8_t buf_all[32+4+80]; + uint8_t buf_all[32+4+32+80]; if (fread(buf_all, sizeof(buf_all), 1, db->headers_tree_file) == 1) { struct const_buffer cbuf_all = {buf_all, sizeof(buf_all)}; @@ -225,8 +225,10 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file uint256 hash; uint32_t height; + uint256 chainwork; deser_u256(hash, &cbuf_all); deser_u32(&height, &cbuf_all); + deser_u256(chainwork, &cbuf_all); dogecoin_bool connected; if (firstblock) { @@ -253,6 +255,7 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file connected_headers_count++; } } + memcpy(db->chaintip->chainwork, chainwork, sizeof(uint256)); } } } @@ -269,9 +272,10 @@ dogecoin_bool dogecoin_headers_db_load(dogecoin_headers_db* db, const char *file * @return Nothing. */ dogecoin_bool dogecoin_headers_db_write(dogecoin_headers_db* db, dogecoin_blockindex *blockindex) { - cstring *rec = cstr_new_sz(100); + cstring *rec = cstr_new_sz(148); // hash + height + chainwork + header ser_u256(rec, blockindex->hash); ser_u32(rec, blockindex->height); + ser_u256(rec, blockindex->chainwork); dogecoin_block_header_serialize(rec, &blockindex->header); size_t res = fwrite(rec->str, rec->len, 1, db->headers_tree_file); dogecoin_file_commit(db->headers_tree_file); @@ -420,11 +424,7 @@ dogecoin_blockindex * dogecoin_headers_db_connect_hdr(dogecoin_headers_db* db, s db->chaintip = blockindex; } - // Free the dynamically allocated memory - dogecoin_free(chaintip_chainwork); - dogecoin_free(added_chainwork); - - if (!load_process && db->read_write_file) + if (!load_process && db->read_write_file && arith_uint256_greater_than(added_chainwork, chaintip_chainwork)) { if (!dogecoin_headers_db_write(db, blockindex)) { fprintf(stderr, "Error writing blockheader to database\n"); @@ -434,6 +434,10 @@ dogecoin_blockindex * dogecoin_headers_db_connect_hdr(dogecoin_headers_db* db, s dogecoin_btree_tsearch(blockindex, &db->tree_root, dogecoin_header_compare); } + // Free the dynamically allocated memory + dogecoin_free(chaintip_chainwork); + dogecoin_free(added_chainwork); + if (db->max_hdr_in_mem > 0) { // de-allocate no longer required headers // keep them only on-disk