On 9/7/21 09:07, 0xB10C via bitcoin-dev wrote:
Hello,
tl;dr: We want to make reorgs on SigNet a reality and are looking for
feedback on approach and parameters.
Awesome!
AJ proposed to allow SigNet users to opt-out of reorgs in case they
explicitly want to remain unaffected. This can be done by setting a
to-be-reorged version bit flag on the blocks that won't end up in the
most work chain. Node operators could choose not to accept to-be-reorged
SigNet blocks with this flag set via a configuration argument.
Why bother with a version bit? This seems substantially more complicated than the original proposal
that surfaced many times before signet launched to just have a different reorg signing key. Thus,
users who wish to follow reorgs can use a 1-of-2 (or higher multisig) and users who wish to not
follow reorgs would use a 1-of-1 (or higher multisig), simply marking the reorg blocks as invalid
without touching any header bits that non-full clients will ever see.
The reorg-interval X very much depends on the user's needs. One could
argue that there should be, for example, three reorgs per day, each 48
blocks apart. Such a short reorg interval allows developers in all time
zones to be awake during one or two reorgs per day. Developers don't
need to wait for, for example, a week until they can test their reorgs
next. However, too frequent reorgs could hinder other SigNet users.
I see zero reason whatsoever to not simply reorg ~every block, or as often as is practical. If users
opt in to wanting to test with reorgs, they should be able to test with reorgs, not wait a day to
test with reorgs.
We propose that the reorg depth D is deterministically random between a
minimum and a maximum based on, e.g., the block hash or the nonce of the
last block before the reorg. Compared to a local randint() based
implementation, this allows reorg-handling tests and external tools to
calculate the expected reorg depth.
# Scenario 1: Race between two chains
For this scenario, at least two nodes and miner scripts need to be
running. An always-miner A continuously produces blocks and rejects
blocks with the to-be-reorged version bit flag set. And a race-miner R
that only mines D blocks at the start of each interval and then waits X
blocks. A and R both have the same hash rate. Assuming both are well
connected to the network, it's random which miner will first mine and
propagate a block. In the end, the A miner chain will always win the race.
# Scenario 2: Chain rollback
This scenario only requires one miner and Bitcoin Core node but also
works in a multiminer setup. The miners mine D blocks with the
to-be-reorged version bit flag set at the start of the interval. After
allowing the block at height X+D to propagate, they invalidate the block
at height X+1 and start mining on block X again. This time without
setting the to-be-reorged version bit flag. Non-miner nodes will reorg
to the new tip at height X+D+1, and the first-seen branch stalls.
Both seem reasonable. I'm honestly not sure what software cases would be hit differently between one
or the other, as long as reorgs happen regularly and at random depth. Nodes should presumably only
ever be following one chain.
# Questions
1. How do you currently test your applications reorg handling? Do
the two discussed scenarios (race and chain rollback) cover your
needs? Are we missing something you'd find helpful?
2. How often should reorgs happen on the default SigNet? Should
there be multiple reorgs a day (e.g., every 48 or 72 blocks
assuming 144 blocks per day) as your engineers need to be awake?
Do you favor less frequent reorgs (once per week or month)? Why?
3. How deep should the reorgs be on average? Do you want to test
deeper reorgs (10+ blocks) too?
6 is the "standard" confirmation window for mainnet. Its arguably much too low, but for testing
purposes we've gotta pick something, so that seems reasonable?
Matt
_______________________________________________
bitcoin-dev mailing list
bitcoin-dev@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/bitcoin-dev