From: jeremy <jeremy.l.rubin@gmail.com>
To: Bitcoin Development Mailing List <bitcoindev@googlegroups.com>
Subject: Re: [bitcoindev] [BIP Proposal] OP_TWEAKADD
Date: Sat, 6 Sep 2025 14:27:55 -0700 (PDT) [thread overview]
Message-ID: <7b8f0cba-1f73-4aa8-8c01-4a7170af1424n@googlegroups.com> (raw)
In-Reply-To: <CAO3Pvs_nvhaDLtxfS2B1TL06o5W9q0Zv1k26xR+PRGS4ZEJsTQ@mail.gmail.com>
[-- Attachment #1.1: Type: text/plain, Size: 6594 bytes --]
Laolu,
Let me know if I miss responding to any points:
I think it'd be fine to down-cost the TWEAKADD to something lower, but I'm
not sure on the exact amount I'd recommend, since there is a link between
amount of data and number of ops you can do, so perhaps worth thinking
(e.g., if a really nice use case we'd want to do 100 of in a row for some
reason, and it uses 10 script bytes, 10 budget might be good, and it would
be annoying if we made it 20... OTOH there is a real DoS concern with
chaining many of these if too cheap).
Generally IIUC, the reason key generation code has to check this, is
because you could be getting entropy from a weird source. It should be
difficult to ever hit this with a SHA256 hashed value. E.g., something like
the current network hashrate dedicated to finding an invalid tweak for 10
billion years, and you would expect to find a single invalid tweak.
In our case, we'd rather not have a common paradigm have malleability, if
using an unhashed tweak for some reason.
Cheers,
Jeremy
On Thursday, September 4, 2025 at 8:43:12 PM UTC-4 Olaoluwa Osuntokun wrote:
> > Second, why fail if the passed scalar is greater than the curve order vs
> > just reducing modulo the order and using that value?
>
> Thinking about it a bit more, I think this is totally the right decision
> and
> makes a lot of sense.
>
> The probability that a random sha256 output will be greater than the order
> of the curve is ~1/2^128, and is something that any key generation code or
> other related application needs to deal with.
>
> Eliminating all sources of malleability in newly proposed op codes is
> important as it serves to increase the binding of transactions w.r.t
> blocks.
>
> Stronger binding of transactions to blocks post segwit (otherwise possible
> to malleate transactions, causing the witness commitment validation to fail
> for an otherwise valid block), helps to mitigate a class of active
> relay impediment attacks and minimizes front-running/extractable value.
>
> -- Laolu
>
> On Wed, Sep 3, 2025 at 7:38 PM Olaoluwa Osuntokun <lao...@gmail.com>
> wrote:
>
>>
>> Hi Jeremy,
>>
>> Cool idea, I had a similar one myself a while back. Shows that great chefs
>> think alike ;). Here're some questions that came to mind as I was
>> reviewing
>> the doc.
>>
>> First, why accept only x-only keys?
>>
>> From the PoV of Bitcoin Script today, they aren't used anywhere within the
>> execution environment. They also add some complexity to protocols that
>> need
>> to accept them as input for further manipulation. They are indeed used for
>> Taproot output public keys, but those keys don't ever make their way down
>> into Script as an op code argument.
>>
>> The musig2 BIP originally accepted x-only keys as input, but was switched
>> to
>> instead accept normal compressed public keys in version v0.8.0 [1]. The
>> switch over enabled some simplifications in the BIP, as it enabled
>> eliminating one of the accumulator variables. For more details, see the
>> discussion that led to this change [2].
>>
>> This comment from Tim resonates with my experience wrangling with bugs
>> introduced by improper/implicit handling of x-only keys over the years:
>>
>> > Sigh yeah, x-only keys save a byte on chain but it seems the price we
>> pay
>> > is a high engineering complexity. I think it's fair to say that noone
>> had
>> > really anticipated this [1].
>>
>> Second, why fail if the passed scalar is greater than the curve order vs
>> just reducing modulo the order and using that value?
>>
>> This would mean that in some cases, the direct value of a hash can't be
>> used
>> as the scalar tweak. The probability of this happening for sha256 outputs
>> is
>> very low, but it presents developers with yet another thing to keep in
>> mind
>> in order to use the op code safely.
>>
>> You bring up the point that this allows the side stepping of a new source
>> of
>> witness malleability, but in the year of Satoshi 16 (2025), aside from
>> relay
>> nuisance shenanigans, is this something developers still need to care
>> about?
>>
>> Third, why allocate a cost of 50 op cost vs something lower to better
>> account for the difference in operation vs normal `OP_CHECKSIG`?
>>
>> Validating a BIP-340 signature requires an extra scalar base mult
>> (ignoring the Strauss-Shamir trick for double scalar mult for a sec) vs
>> `OP_TWEAKADD` as it's defined in your draft BIP. As a result, one could
>> argue that the op code should have a lower cost vs `OP_CHECKSIG`.
>>
>> -- Laolu
>>
>> [1]: https://github.com/jonasnick/bips/pull/37
>> [2]: https://github.com/jonasnick/bips/issues/32
>>
>> On Sat, Aug 23, 2025 at 10:36 AM jeremy <jeremy....@gmail.com> wrote:
>>
>>> Hi all,
>>>
>>> I've made a draft BIP writeup of an (often discussed) simple opcode,
>>> OP_TWEAKADD, deployable as an OP_SUCCESSx upgrade.
>>>
>>> https://github.com/bitcoin/bips/pull/1944
>>>
>>> This opcode is relatively simple. The main design choices are:
>>>
>>> 1) Verify v.s. Push semantics -- Push, for succinctness on-chain
>>> 2) Argument order -- Key on top, for tweak in witness
>>> 3) Plain tweak or something else -- Plain tweak, if hashing is desirable
>>> the user can do it. The most flexible is to do a plain tweak. Future work
>>> could add TapTree opcodes to construct taproot tweaks.
>>>
>>> Feedback and discussion are welcome.
>>>
>>> Best,
>>>
>>> Jeremy
>>>
>>> [^1] OP_SHA256 in these example prevents key-cancellation.
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Bitcoin Development Mailing List" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to bitcoindev+...@googlegroups.com.
>>> To view this discussion visit
>>> https://groups.google.com/d/msgid/bitcoindev/bc9ff794-b11e-47bc-8840-55b2bae22cf0n%40googlegroups.com
>>> <https://groups.google.com/d/msgid/bitcoindev/bc9ff794-b11e-47bc-8840-55b2bae22cf0n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>
--
You received this message because you are subscribed to the Google Groups "Bitcoin Development Mailing List" group.
To unsubscribe from this group and stop receiving emails from it, send an email to bitcoindev+unsubscribe@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/bitcoindev/7b8f0cba-1f73-4aa8-8c01-4a7170af1424n%40googlegroups.com.
[-- Attachment #1.2: Type: text/html, Size: 9139 bytes --]
prev parent reply other threads:[~2025-09-07 10:41 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-23 17:35 [bitcoindev] [BIP Proposal] OP_TWEAKADD jeremy
2025-08-23 18:24 ` [bitcoindev] " jeremy
2025-09-04 2:38 ` [bitcoindev] " Olaoluwa Osuntokun
2025-09-04 22:46 ` Olaoluwa Osuntokun
2025-09-06 21:27 ` jeremy [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7b8f0cba-1f73-4aa8-8c01-4a7170af1424n@googlegroups.com \
--to=jeremy.l.rubin@gmail.com \
--cc=bitcoindev@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox