lbryio / lbcd

An alternative full node implementation of LBRY's blockchain written in Go (golang)
https://lbry.com/
ISC License
38 stars 25 forks source link

`invalidateblock` goes back one block at a time, and doesn't reorg properly #86

Open roylee17 opened 1 year ago

roylee17 commented 1 year ago

For example,

100 -> 101 -> 102 -> 103  (main chain)
     \ 101a (side chain)
  1. invalidate one block at a time from the tip works.
$ getbestblock
{
  hash: HASH_OF_103
  height: 103
}

$ invalidateblock HASH_OF_103
$ invalidateblock HASH_OF_102

$ getbestblock
{
  hash: HASH_OF_101
  height: 101
}
  1. However, even if we invalidate block 101, the main chain doesn't reorg properly to block 101a

    $ invalidateblock HASH_OF_101 
    $ getbestblock
    {
    hash: HASH_OF_101a
    height: 101a
    }
    $ getblock HASH_OF_101a
    block HASH_OF_101a is not in the main chain
  2. invalidate more than one block at a time cause lbcd goes rogue. Starting to exhaust CPU and memory.

    
    $ getbestblock
    {
    hash: HASH_OF_103
    height: 103
    }

$ invalidateblock HASH_OF_101 (lbcd goes rogue...)

roylee17 commented 1 year ago

https://github.com/lbryio/lbry-sdk/issues/3520

BrannonKing commented 1 month ago

Just want to comment that this was recently fixed in btcd: https://github.com/btcsuite/btcd/pull/2196 , so the fix could be replicated here.