Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}