Hello Poinsot,
Thanks for the update. If I'm understanding correctly Luke's concern,
currently the coinbase's scriptSig is used to store an extranonce. One
has to observe first there is no consensus limit on the size of a
transaction, which holds for the coinbase tx too, a fortiori there is
no limit on the extranonce size a miner could fit in the scriptSig.
The point being made is that the nLocktime field of the coinbase
transaction could be used as a more efficient extra nonce due to
the positional location of nLocktime in a serialized coinbase being
one of the latest message block to be processed [0].
Nothing prevent a miner in already doing this and draw a speed advantage
from the diminished computational work. I have not looked into CGminer code
or one of its derivative forks, if there is an implemented option to do that,
but yes there could be non-published existing mining firmware doing it. IIUC,
BIP54 would nullify this theoretical "speed advantage" for all miners.
Now, there could be an argument ecosystem-wise to let the nLocktime free,
as who say speed advantage say less energy consumed network-wide (-- but
isn't that a better outcome to maximize the energy burnt network-wide, even
if it's probabilistic ?).
One alternative design would be to store the height commitment in the
commitment extension introduced by BIP141 [1]. In my understanding, as
it has been pointed out by other minds in the design process about the
actual proposal to put the height commitment in the nLocktime field,
in the eventuality of more than 1 commitment being introduced, a naive
design would come with the burden for non-upgraded nodes to have data
availability to all the merkle path to validate a specific soft-forked
commitment. So a node could not just implement consensus validation rules
for SF #2, without getting the merkle tree data for SF #1.
It doesn't sound that this concern could be alleviated by making the
"witness reserved value", a slot vectors of commitments (e.g type-length-value),
rather than a merkle tree, if you don't know the meaning of a commitment,
there is no need to fetch over p2p the undefined data, just jump to the
next slot. While indeed, such design would deserve better precision, I'm
thinking it could be another option about where to fit the height commitment.
On the downside, as it has been pointed too before, it would render the
validation done by embedded signers more complicated, as one would have
to give the header + merkle proof for the coinbase tx inclusion + the coinase
tx + the witness reserved value commitment + the field in itself. Now,
those embedded signers, for the most sophisticated one e.g validating
lighting channels, due to space constraints, are only validating a subset
of the consensus rules (e.g it doesn't validate the lack of inflation).
So it's unclear to me, that you would strongly clear about validating
the height commitment of the coinbase tx (ensuring the lineage of the
utxo down to your smart contract is sane ?).
An alternative can be to split the u32 nLocktime field in a u24 | u8, with
the u8 field being reserved as an extranonce. An u24 would waive the problem
for few more hundreds of years. So it would be a 40-bit total nonce, made
of a header's nonce + 8 bits nonce. I've not looked into historical blocks
to see what is the extranonce size used in the scriptSig in average.
About the second concern, i.e Jeremy / Eric's one, i.e the risks of
creating a validity "seam" that might introduces unforeseen complexity
in the design of smart contracts. Made the point w.r.t to the 2500 new
sigops limit for legacy tx, but the 64-byte limit size comes with a corner
case, when you're burning funds as additional fees to bump the confirmation
of a time-sensitive tx. Post-BIP54, that means any tx smart contract toolchain
has to be updated to rule out this tx size (e.g for lightning, at `closing_signed`
processing).
While indeed, not ruling out the 64-byte case might be only a benign effect,
evluating when you should do it or not ask for a lot of inner know-how from
the PoV of the smart contract toolchain developer. And this is not something
necessarily done once for all, the level of adversarial collaborative tx
malleability that can be achieved by the counterparty can be silently call
to re-evaluation e.g when you're upgrading your protocol form using p2wsh
to p2tr where the signature size changes.
Anyway, my thinking is that a fix long block validation time is a really must
have, fixes for difficulty adjustment exploits is also very good to have (what
was Vertcoin that got exploited on this ?), I'm more skeptical on the merkle tree
malleability fix (for protocols using SPV proofs, it can be mitigated by additional
check within their toolchain) and for the fix of duplicate coinbase transactions,
the fix design could be improved.
As I echoed previously, we can still assign a deployment bit to each proposed fix,
while it's very obviously more coordination work ecosystem-wise in the hypothesis
of multiple distincts activations, this also let more room to get in earlier the
consensus cleanup more serious. Not a hill I'm ready to die on, but IMHO separating
the consensus changes in 4 distinct proposals is better development and deployment
practice (-- if social consensus is gathered to have all the fixes in one deployment
we can still have one signaling bit and activation sequence).
Best,
Riard
OTS hash: 808f61fd6438ac7a9e4a2c07a2665e6e7dffb7f831897f0dcbb8134cffad5d0b
[0]
https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf[1]
https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki[2]
https://gnusha.org/pi/bitcoindev/aa916637-befa-795a...@electrum.org/