recompute state bug fixed

This commit is contained in:
2026-05-29 13:51:34 +02:00
parent 763aeb648f
commit 39293029c5
3 changed files with 10 additions and 1 deletions

View File

@@ -28,6 +28,10 @@ void Chain_Wipe(blockchain_t* chain);
// Returns true on success.
bool Chain_RollbackToHeight(blockchain_t* chain, size_t height);
// Recompute `currentSupply` and `currentReward` from the in-memory chain blocks.
// Returns true on success and updates runtime state globals.
bool Chain_RecomputeRuntimeState(blockchain_t* chain);
// Retrieve a deep copy of the block at `index`. Caller must free with `Block_Destroy`.
bool Chain_GetBlockCopy(blockchain_t* chain, size_t index, block_t** outCopy);

View File

@@ -97,7 +97,7 @@ static bool DebitAddress(const uint8_t address[32], const uint256_t* amount) {
return BalanceSheet_Insert(entry) >= 0;
}
static bool Chain_RecomputeRuntimeState(blockchain_t* chain) {
bool Chain_RecomputeRuntimeState(blockchain_t* chain) {
if (!chain) {
return false;
}

View File

@@ -698,6 +698,11 @@ int main(int argc, char* argv[]) {
uint8_t lastSavedHash[32] = {0};
if (!Chain_LoadFromFile(chain, chainDataDir, &currentSupply, &difficultyTarget, &currentReward, lastSavedHash, false)) {
printf("No existing chain loaded from %s\n", chainDataDir);
} else {
// Recompute runtime supply/reward from loaded blocks to avoid trusting stale meta values.
if (!Chain_RecomputeRuntimeState(chain)) {
fprintf(stderr, "Failed to recompute runtime state from loaded chain\n");
}
}
if (!BalanceSheet_LoadFromFile(chainDataDir)) {