Skip to content

Add ReorgChain IR operation - #219

Open
NishantBansal2003 wants to merge 3 commits into
lnfuzz:masterfrom
NishantBansal2003:block-reorg
Open

Add ReorgChain IR operation#219
NishantBansal2003 wants to merge 3 commits into
lnfuzz:masterfrom
NishantBansal2003:block-reorg

Conversation

@NishantBansal2003

Copy link
Copy Markdown
Contributor

ReorgChain Performance

The following seed was used to measure performance:

v0 = LoadPrivateKey(0x1111111111111111111111111111111111111111111111111111111111111111)
v1 = DerivePoint(v0)
v2 = LoadChainHashFromContext()
v3 = LoadChannelId(0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb)
v4 = LoadAmount(100000)
v5 = LoadAmount(0)
v6 = LoadAmount(546)
v7 = LoadAmount(100000000)
v8 = LoadAmount(1000)
v9 = LoadAmount(1000)
v10 = LoadFeeratePerKw(253)
v11 = LoadU16(144)
v12 = LoadU16(483)
v13 = LoadU8(0)
v14 = LoadShutdownScript(P2wpkh(0xa10d9257489e685dda030662390dc177852faf13))
v15 = LoadChannelType(Anchors)
v16 = BuildOpenChannel(v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v1, v1, v1, v1, v1, v1, v13, v14, v15)
v17 = SendOpenChannel(v16)
v18 = RecvAcceptChannel(v17)
v19 = ExtractFundingPubkey(v18)
v20 = CreateFundingTransaction(v1, v19, v4, v10)
v21 = SendFundingCreated(v20, v0, v3)
v22 = RecvFundingSigned(v21)
BroadcastTransaction(v20)
MineBlocks(2)
ReorgChain(2)
MineBlocks(8)
v27 = LoadShortChannelId(0x0x0)
SendChannelReady{include_alias=true}(v22, v1, v27)
RecvChannelReady()

cln

  target:      cln
  runs:        100
  local:       1 cpu, 2048 MB
  nyx:         1 cpu, 2048 MB

  per-call timings
                         +-------------------- local --------------------+   +--------------------- nyx ---------------------+
  #   rpc                      min      mean    median       p99       max         min      mean    median       p99       max
  1   getbestblockhash      0.75ms    1.01ms    1.01ms    1.42ms    1.59ms      0.54ms    1.34ms    0.59ms    7.58ms    7.61ms
  2   getblock              0.80ms    1.04ms    1.02ms    1.45ms    1.49ms      0.85ms    2.26ms    0.87ms   12.02ms   12.16ms
  3   getblock              0.79ms    1.01ms    0.98ms    1.60ms    1.65ms      0.60ms    6.60ms    7.78ms    7.97ms    8.23ms
  4   invalidateblock       1.13ms    1.45ms    1.43ms    1.91ms    1.96ms      1.15ms    3.66ms    2.95ms   12.02ms   12.35ms
  5   getnewaddress         3.33ms    7.34ms    5.72ms   15.43ms   16.60ms      1.35ms    6.29ms    8.53ms   14.27ms   16.43ms
  6   generateblock         1.16ms    1.43ms    1.39ms    1.80ms    1.82ms      1.13ms    6.58ms    5.51ms   13.48ms   14.45ms
  7   generateblock         1.04ms    1.48ms    1.46ms    2.01ms    2.06ms      1.04ms    7.01ms    6.66ms   14.33ms   16.35ms
  8   generateblock         1.04ms    1.38ms    1.31ms    1.94ms    2.26ms      1.90ms    7.94ms    4.59ms   22.11ms   22.19ms
  9   getrawmempool         0.79ms    1.01ms    0.97ms    1.53ms    1.60ms      0.61ms    6.96ms    4.82ms   37.21ms   40.27ms

  slowest single reorg
  local docker - run 31 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=26.881799ms calls=9 [getbestblockhash=1.119332ms getblock=1.248212ms getblock=1.107329ms invalidateblock=1.596864ms getnewaddress=16.595872ms generateblock=1.351991ms generateblock=1.249398ms generateblock=1.66686ms getrawmempool=945.941µs]

  nyx - exec 6 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=72.491251ms calls=9 [getbestblockhash=604.747µs getblock=866.493µs getblock=7.785566ms invalidateblock=2.63551ms getnewaddress=1.941464ms generateblock=6.387501ms generateblock=7.40764ms generateblock=4.592024ms getrawmempool=40.270306ms]

lnd

  target:      lnd
  runs:        100
  local:       1 cpu, 2048 MB
  nyx:         1 cpu, 2048 MB

  per-call timings
                         +-------------------- local --------------------+   +--------------------- nyx ---------------------+
  #   rpc                      min      mean    median       p99       max         min      mean    median       p99       max
  1   getbestblockhash      0.89ms    1.22ms    1.14ms    2.09ms    2.31ms      0.55ms    0.91ms    1.02ms    1.21ms    1.21ms
  2   getblock              0.90ms    1.29ms    1.25ms    2.21ms    2.31ms      0.54ms    0.59ms    0.56ms    0.73ms    0.74ms
  3   getblock              0.88ms    1.25ms    1.17ms    1.92ms    2.32ms      0.54ms    0.61ms    0.58ms    0.72ms    0.73ms
  4   invalidateblock       1.18ms    1.67ms    1.62ms    2.71ms    3.13ms      2.37ms    2.50ms    2.44ms    2.71ms    2.88ms
  5   getnewaddress         3.51ms    7.64ms    5.66ms   15.88ms   17.36ms      0.64ms    0.66ms    0.66ms    0.69ms    0.69ms
  6   generateblock         1.10ms    1.56ms    1.47ms    2.36ms    2.58ms      2.89ms    2.95ms    2.95ms    3.01ms    3.01ms
  7   generateblock         1.07ms    1.49ms    1.42ms    2.19ms    2.64ms      4.46ms    4.70ms    4.52ms    8.11ms    8.14ms
  8   generateblock         1.08ms    1.47ms    1.37ms    2.42ms    2.43ms      3.31ms    4.10ms    4.02ms    5.24ms    7.89ms
  9   getrawmempool         0.84ms    1.17ms    1.09ms    1.85ms    1.88ms      1.52ms    3.18ms    3.23ms    3.59ms    4.05ms

  slowest single reorg
  local docker - run 55 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=28.135889ms calls=9 [getbestblockhash=931.795µs getblock=1.353712ms getblock=1.363745ms invalidateblock=1.695072ms getnewaddress=15.689844ms generateblock=1.858803ms generateblock=2.188789ms generateblock=1.445327ms getrawmempool=1.608802ms]

  nyx - exec 1 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=23.218675ms calls=9 [getbestblockhash=1.085698ms getblock=740.471µs getblock=547.125µs invalidateblock=2.713807ms getnewaddress=688.658µs generateblock=2.950767ms generateblock=8.140185ms generateblock=4.095945ms getrawmempool=2.256019ms]

ldk

  target:      ldk
  runs:        100
  local:       1 cpu, 2048 MB
  nyx:         1 cpu, 2048 MB

  per-call timings
                         +-------------------- local --------------------+   +--------------------- nyx ---------------------+
  #   rpc                      min      mean    median       p99       max         min      mean    median       p99       max
  1   getbestblockhash      0.76ms    0.94ms    0.87ms    1.80ms    2.22ms      0.54ms    0.58ms    0.58ms    0.60ms    0.60ms
  2   getblock              0.82ms    1.08ms    1.03ms    2.02ms    2.03ms      0.84ms    0.86ms    0.86ms    0.90ms    0.93ms
  3   getblock              0.76ms    0.96ms    0.92ms    1.46ms    1.48ms      3.55ms    5.77ms    5.94ms    6.08ms    6.13ms
  4   invalidateblock       1.00ms    1.29ms    1.21ms    1.98ms    1.99ms      1.03ms    1.28ms    1.06ms    1.73ms    3.21ms
  5   getnewaddress         3.01ms    5.25ms    5.01ms   15.49ms   16.56ms      0.65ms    0.67ms    0.66ms    0.72ms    1.17ms
  6   generateblock         1.01ms    1.26ms    1.21ms    1.71ms    1.83ms      1.05ms    1.11ms    1.11ms    1.16ms    1.17ms
  7   generateblock         1.03ms    1.23ms    1.15ms    1.82ms    1.89ms      3.06ms    3.19ms    3.20ms    3.28ms    3.29ms
  8   generateblock         0.98ms    1.58ms    1.15ms   16.34ms   21.70ms      1.03ms    1.17ms    1.07ms    2.35ms    6.98ms
  9   getrawmempool         0.78ms    0.89ms    0.84ms    1.51ms    1.94ms      3.12ms    4.39ms    4.40ms    5.45ms    5.52ms

  slowest single reorg
  local docker - run 85 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=34.549173ms calls=9 [getbestblockhash=841.128µs getblock=943.049µs getblock=985.803µs invalidateblock=1.264845ms getnewaddress=4.049329ms generateblock=1.352766ms generateblock=1.468986ms generateblock=21.703925ms getrawmempool=1.939342ms]

  nyx - exec 86 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=23.945307ms calls=9 [getbestblockhash=573.909µs getblock=858.127µs getblock=5.634966ms invalidateblock=1.469184ms getnewaddress=666.007µs generateblock=1.115342ms generateblock=3.177818ms generateblock=6.975373ms getrawmempool=3.474581ms]

eclair

  target:      eclair
  runs:        100
  local:       1 cpu, 2048 MB
  nyx:         1 cpu, 2048 MB

  per-call timings
                         +-------------------- local --------------------+   +--------------------- nyx ---------------------+
  #   rpc                      min      mean    median       p99       max         min      mean    median       p99       max
  1   getbestblockhash      0.75ms    1.03ms    0.98ms    1.57ms    1.75ms      0.45ms    4.54ms    0.92ms   10.63ms   10.90ms
  2   getblock              0.77ms    1.07ms    1.01ms    1.73ms    1.95ms      0.45ms    1.56ms    0.49ms   10.30ms   10.32ms
  3   getblock              0.78ms    1.05ms    1.00ms    1.74ms    1.90ms      0.44ms    2.06ms    0.48ms   10.37ms   10.66ms
  4   invalidateblock       0.96ms    1.36ms    1.31ms    2.01ms    2.08ms      1.02ms    2.51ms    1.23ms   10.91ms   10.94ms
  5   getnewaddress         3.75ms   10.98ms    6.73ms   27.74ms   28.30ms      0.55ms    0.65ms    0.58ms    1.37ms    1.80ms
  6   generateblock         1.02ms    1.38ms    1.34ms    2.09ms    2.57ms      0.96ms    1.02ms    1.02ms    1.10ms    1.11ms
  7   generateblock         0.96ms    1.33ms    1.25ms    2.32ms    2.90ms      0.83ms    0.86ms    0.85ms    0.96ms    0.96ms
  8   generateblock         0.90ms    1.29ms    1.22ms    2.26ms    2.29ms      0.80ms    0.83ms    0.83ms    0.86ms    0.87ms
  9   getrawmempool         0.68ms    0.97ms    0.93ms    1.56ms    1.60ms      0.44ms    0.45ms    0.45ms    0.47ms    0.52ms

  slowest single reorg
  local docker - run 9 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=37.556412ms calls=9 [getbestblockhash=910.153µs getblock=1.174061ms getblock=1.004902ms invalidateblock=1.50394ms getnewaddress=27.73844ms generateblock=1.40977ms generateblock=1.277046ms generateblock=1.683209ms getrawmempool=854.891µs]

  nyx - exec 29 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=16.835445ms calls=9 [getbestblockhash=10.902442ms getblock=491.732µs getblock=472.841µs invalidateblock=1.203525ms getnewaddress=575.971µs generateblock=1.044437ms generateblock=847.526µs generateblock=852.639µs getrawmempool=444.332µs]

Adds `reorg_chain(depth)`, which disconnects the top depth
blocks with `invalidateblock` and mines depth + 1 empty
blocks, causing a natural chain reorg. Since the replacement
blocks are empty, disconnected transactions become unconfirmed,
Bitcoin Core restores mempool-eligible transactions, while the
rest are returned in `ReorgedTxs::rejected_txs`, along with all
disconnected non-coinbase txids in block order. Rejected
transactions must be queued for direct mining since they
typically violate mempool policy.

Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>
Adds a `ReorgChain` operation that disconnects the top
blocks and mines empty replacement blocks, allowing
scenarios to exercise transactions losing their confirmations.

After the reorg, the executor restores disconnected
transactions to the unmined state and places transactions
rejected by Bitcoin Core at the front of the private mempool
so they can be mined directly again. This is necessary for
transactions that violate mempool policy and would otherwise
remain unconfirmed.

Supports reorgs of one or two blocks, covering the shallow
reorgs a node is expected to handle naturally.

Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>
Generates a shallow chain reorganization: mines blocks
to confirm any broadcast transaction, then reorgs the
chain out from under it, so generated programs exercise
a funding transaction losing its confirmations. Depth is
1 or 2, the shallow reorgs that occur naturally on mainnet
and that a node is expected to handle.

Signed-off-by: Nishant Bansal <nishant.bansal.282003@gmail.com>
@NishantBansal2003

Copy link
Copy Markdown
Contributor Author

CLN results after rebasing onto the manual-sync RPC approach (#211). I assume the likely reason for the improved performance compared to before is that -blocknotify spawned an async lightning-cli syncblocks process on every tip update, including the ones during the reorg itself, and it may have taken some time for those to be processed and for the extra bitcoin-cli RPCs they trigger to be handled

  target:      cln
  runs:        100
  local:       1 cpu, 2048 MB
  nyx:         1 cpu, 2048 MB

  per-call timings
                         +-------------------- local --------------------+   +--------------------- nyx ---------------------+
  #   rpc                      min      mean    median       p99       max         min      mean    median       p99       max
  1   getbestblockhash      0.73ms    1.03ms    1.01ms    1.51ms    1.63ms      0.68ms    0.94ms    0.74ms    1.75ms    1.76ms
  2   getblock              0.83ms    1.07ms    1.00ms    1.61ms    1.64ms      1.80ms    2.44ms    2.61ms    2.80ms    2.88ms
  3   getblock              0.79ms    1.04ms    1.00ms    1.58ms    1.67ms      1.55ms    3.79ms    3.83ms    4.08ms    4.08ms
  4   invalidateblock       1.04ms    1.36ms    1.33ms    1.72ms    1.98ms      2.30ms    2.82ms    2.79ms    4.52ms    4.52ms
  5   getnewaddress         3.48ms    7.37ms    5.72ms   14.76ms   15.03ms      1.43ms    1.95ms    1.81ms    3.10ms    3.17ms
  6   generateblock         1.10ms    1.46ms    1.42ms    2.02ms    2.05ms      0.97ms    2.70ms    2.87ms    4.11ms    4.14ms
  7   generateblock         1.00ms    1.39ms    1.30ms    2.08ms    2.11ms      0.88ms    2.15ms    2.26ms    3.05ms    3.05ms
  8   generateblock         0.96ms    1.24ms    1.21ms    1.67ms    1.69ms      0.86ms    0.91ms    0.91ms    0.95ms    0.96ms
  9   getrawmempool         0.77ms    0.96ms    0.93ms    1.36ms    1.53ms      0.52ms    0.54ms    0.53ms    0.56ms    0.57ms

  slowest single reorg
  local docker - run 12 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=25.303404ms calls=9 [getbestblockhash=1.394301ms getblock=1.444524ms getblock=1.672391ms invalidateblock=1.512372ms getnewaddress=14.755336ms generateblock=1.143726ms generateblock=1.471628ms generateblock=1.018857ms getrawmempool=890.269µs]

  nyx - exec 16 of 100
  DEBUG [smite::bitcoin] [rpc] reorg_chain(depth=2) total=19.396539ms calls=9 [getbestblockhash=1.761566ms getblock=1.967972ms getblock=4.057905ms invalidateblock=3.0374ms getnewaddress=1.507319ms generateblock=2.528649ms generateblock=3.053345ms generateblock=920.552µs getrawmempool=561.831µs]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant