static void blockstore_set_best_chain(struct blockstore *bs, struct blockentry *be, const uint256 *hash) { int height; height = blockstore_find_alternate_chain_height(bs, be); Log(LGPFX" orphan block: alternate chain height is %d vs current %d\n", height, bs->height); if (height <= bs->height) { return; } /* * Properly wire the new chain. */ blockstore_set_chain_links(bs, be); bs->best_chain = be; bs->height = height; memcpy(&bs->best_hash, hash, sizeof *hash); }
static int blockstore_find_alternate_chain_height(struct blockstore *bs, struct blockentry *be) { struct blockentry *prev; int height; mutex_lock(bs->lock); if (be->height > 0) { mutex_unlock(bs->lock); return be->height; } ASSERT(be->height == -1); // orphan prev = blockstore_lookup(bs, &be->header.prevBlock); if (prev == NULL) { mutex_unlock(bs->lock); return 0; } height = 1 + blockstore_find_alternate_chain_height(bs, prev); mutex_unlock(bs->lock); return height; }