BIP459: DahLIAS fully aggregated signatures for secp256k1 #2210

pull fjahr wants to merge 3 commits into bitcoin:master from fjahr:fullagg changing 29 files +2416 −0
  1. fjahr commented at 1:26 PM on July 11, 2026: contributor

    This is a BIP draft for creating Schnorr-style Full Aggregate signatures, a standard for the DahLIAS scheme by Jonas Nick, Tim Ruffing, and Yannick Seurin. It complements BIP458 half-aggregation. Full-aggregation results in a constant 64-byte signature but requires an interactive signing protocol.

    Compared to the version shared on the mailing list recently, this version incorporates waxwing's feedback from the thread, most notably:

    1. More info on the uniqueness check in Sign and new test vectors covering this and other checks
    2. A description of the deterministic nonce attack
    3. Clarifications on the security model and other language improvements for clarity

    The reference implementation is written in Python based on secp256k1lab, and the latest master of secp256k1lab is vendored with the BIP, same as it was done for BIP458.

  2. fjahr commented at 1:30 PM on July 11, 2026: contributor

    I had asked BIP editors to reserve 459 for this so the CISA related BIPs can be in consecutive order, but I didn't want to cause confusion as it might have looked like self-assigment if had just pushed it with the number. So waiting for a confirmation for the number :)

  3. jonatack commented at 1:47 PM on July 11, 2026: member

    Yes, 459 was reserved for Full-Aggregation of BIP340 Signatures.

  4. jonatack added the label New BIP on Jul 11, 2026
  5. fjahr renamed this:
    BIP draft: Full-Aggregation of BIP340 Signatures
    BIP459: Full-Aggregation of BIP340 Signatures
    on Jul 11, 2026
  6. BIP459: Add vendored secp256k1lab library
    Add a vendored copy of the secp256k1lab library (master branch, commit
    a265da139aea27386085a2a8760f8698e1bda64e) that the full-aggregation
    reference implementation and test vector scripts depend on.
    98b2bbdf6d
  7. fjahr force-pushed on Jul 11, 2026
  8. fjahr commented at 8:29 PM on July 21, 2026: contributor

    One imprecision here that I am grappling with: While this says "Full-Aggregation of BIP340 Signatures" technically this doesn't aggregate BIP340 signatures like half-agg does because there is never an actual BIP340 signature created. Rather, there could have been a BIP 340 signature in its place instead, and this builds on Schnorr which is tied to BIP340 in the Bitcoin context. Expressing that more correctly felt like bending over backwards when I tried and might have caused more confusion that clarity. But I wanted to make clear that I am aware of this and happy to take suggestions for changes if people think this improves the BIP.

  9. AdamISZ commented at 12:46 AM on July 22, 2026: contributor

    About the Nonce Generation warning on deterministic signatures:

    related to my earlier comments on the list and elsewhere, about 'what if there is a folklore "acceptably secure" single-owner aggregation that doesn't follow the DahLIAS protocol', how about this one: suppose a user does use RFC6979-style deterministic nonce-generation, reasoning "well, the attack is only if I'm signing with someone else, but I'm not". You might reasonably retort: but it specifically says under "Nonce generation" that it 'MUST NOT BE USED' and references active attackers, but I'd counter that the explanatory footnote refers specifically to co-signers as the threat; so a person may read that and think "I have no co-signers, no risk".

    There is at least one case where it could leak keys: if you sign with ACP, and you are convinced by external actions to, say, do RBF or "redo" the transaction elsewise, you could end up using the same nonce for different challenges.

    Apologies if this is too much like pedantry; I am less looking at it from the angle of "is this protocol correct?" and more from the angle of "what stupid, but plausible, thing are people likely to do?". With MuSig2 I feel like it's less of an issue (though of course people certainly can shoot themselves in the foot!), I am thinking of smaller wallet developers looking for the "I can give my users cheaper transactions!" angle, but who don't understand the deeper/subtler parts of what's going on here.

  10. real-or-random commented at 7:00 PM on July 24, 2026: contributor

    While this says "Full-Aggregation of BIP340 Signatures" technically this doesn't aggregate BIP340 signatures like half-agg does

    Yeah, I agree that this is confusing. Technically, it doesn't aggregate any signatures (at most partial signatures). This is a property that sets this apart from the half-agg BIP. So if these proposals are very different, it's okay (or even good) to have very different titles.

    Some suggestions in decreasing order of preference

    • "Full Aggregate Schnorr-style Signatures"
    • "Full Aggregate BIP340-style Signatures" (not that wrong, but if you ask me, I'd still avoid BIP340).
    • "Full Aggregate Signatures on secp256k1"
    • "Interactive Aggregate Signatures on secp256k1" (again not wrong, but I think the half/full terms are well established in the community)
    • "DahLIAS on secp256k1" (doesn't tell you anything)

    (I'm trying to avoid if this should be "Full-Aggregate" or even "Fully Aggregate" instead... Let's leave that to a native speaker. Or an LLM.:D)

  11. fjahr force-pushed on Jul 27, 2026
  12. fjahr commented at 1:52 PM on July 27, 2026: contributor

    Pushed a few more changes:

    • Renamed the BIP per @real-or-random 's suggestion and made further edits to avoid the "aggregate bip340 signatures" statement
    • Changed the license per the comment here: #2205 (review)
    • Added some extra details to the nonce gen part to address @AdamISZ 's comment: #2210 (comment)

    Thanks a lot for the feedback!

  13. AdamISZ commented at 2:32 PM on July 27, 2026: contributor

    On the title, yeah it's a tricky one. BIP340's title is similar to some of @real-or-random 's suggestions (and is the closest match, maybe) while BIP 327 has "MuSig2 for BIP340-compatible Multi-Signatures". As noted, "BIP340 compatible" can't be cross-applied here. While note that BIP327 does use the name of the scheme. Hence I'm not sure why @real-or-random dismisses "DahLIAS" as not conveying information; arguably that is the most specific, pertinent information (the actual scheme/protocol). Though I infer your meaning as: higher-level reader is not going to know what that term means. But the same could be said of "MuSig2". The thing that I think I would want the skim-reader to know is "this is a completely new (and therefore consensus changing in usage) type of bitcoin signing, using a new aggregation protocol". The niceties of it being Schnorr-like at the deeper conceptual, structural level I guess are not massively important. I'd be tempted by "DahLIAS aggregated signatures for bitcoin" or something like that (I was thinking that 'for bitcoin transactions' or 'for cross-input signature aggregation' are wrong because that's not this BIP, that's the other one).

    Though I don't think @real-or-random 's "DahLIAS for secp256k1" is wrong either (as he seems to :) ), mirroring the BIP340 title. I suppose that might depend on whether there is a foreseen usage of this protocol outside of bitcoin consensus.

  14. fjahr commented at 2:55 PM on July 27, 2026: contributor

    "DahLIAS aggregated signatures for bitcoin"

    You are making good points @AdamISZ but I think the "for bitcoin" part is redundant given that we are in the BIPs repo here where everything should be specified for bitcoin to some degree. Otherwise I would be fine with adopting this name as well, but I do think there could be some minor confusion for casual readers since "full-agg" is kind of established as the casual, conversational name for what the BIP specifies.

  15. fjahr renamed this:
    BIP459: Full-Aggregation of BIP340 Signatures
    BIP459: Full Aggregate Schnorr-style Signatures
    on Jul 27, 2026
  16. real-or-random commented at 3:33 PM on July 27, 2026: contributor

    Hence I'm not sure why @real-or-random dismisses "DahLIAS" as not conveying information; arguably that is the most specific, pertinent information (the actual scheme/protocol). Though I infer your meaning as: higher-level reader is not going to know what that term means.

    Right! that's what I had in mind. If you don't know what DahLIAS is, then you have idea what this is about.

    But the same could be said of "MuSig2".

    Hm, in principle that's true, but if I remember correctly the term MuSig was floating in the community already for a while. Whereas (due to the lack of a concrete scheme), the most common term floating around for what this BIP proposes was "full aggregation", so I think it's nice to have this (or a variant of it) in the title.

    The thing that I think I would want the skim-reader to know is "this is a completely new (and therefore consensus changing in usage) type of bitcoin signing, using a new aggregation protocol". The niceties of it being Schnorr-like at the deeper conceptual, structural level I guess are not massively important.

    I tend to agree. The fact that this is not compatible to Schnorr is important (though the actual consensus change is proposed in the other BIP). Maybe my proposal of stressing the similarity to Schnorr comes from my cryptographer bias. But what should be made clear somehow is that this is EC-based (i.e., not post-quantum).

    I'd be tempted by "DahLIAS aggregated signatures for bitcoin" or something like that (I was thinking that 'for bitcoin transactions' or 'for cross-input signature aggregation' are wrong because that's not this BIP, that's the other one).

    Though I don't think @real-or-random 's "DahLIAS for secp256k1" is wrong either (as he seems to :) ), mirroring the BIP340 title. I suppose that might depend on whether there is a foreseen usage of this protocol outside of bitcoin consensus.

    What about "DahLIAS fully aggregated signatures for secp256k1" (or "... on secp256k1")?

    This ticks all the boxes for me:

    • Mentions DahLIAS instead of Schnorr explicitly. (It mentions the new term DahLIAS and doesn't mention Schnorr which could be mistaken to imply compatibility to the existing Bitcoin network.)
    • Mentions the known term "full aggregation".
    • Mentions secp256k1, which stresses that it's EC-based.
    • Doesn't mention that intended uses would change consensus (and that makes sense because it's in the other BIP).
    • Still reasonably concise
  17. fjahr commented at 7:02 PM on July 27, 2026: contributor

    What about "DahLIAS fully aggregated signatures for secp256k1" (or "... on secp256k1")?

    Sounds good to me but I will wait for @AdamISZ 's feedback this time ;) Double-checked that this is under the 50-character limit, which it is at 49 :D

  18. AdamISZ commented at 7:09 PM on July 27, 2026: contributor

    Great, I agree with "DahLIAS fully aggregated signatures for secp256k1" . Noted and agreed @fjahr about the 'fully' part, I wasn't considering that, but it's important here.

  19. fjahr renamed this:
    BIP459: Full Aggregate Schnorr-style Signatures
    BIP459: DahLIAS fully aggregated signatures for secp256k1
    on Jul 27, 2026
  20. fjahr force-pushed on Jul 27, 2026
  21. fjahr commented at 7:28 PM on July 27, 2026: contributor

    Renamed to "DahLIAS fully aggregated signatures for secp256k1". Thanks a lot for hashing this out @real-or-random and @AdamISZ !

  22. AdamISZ commented at 11:29 PM on August 11, 2026: contributor

    I think there might be more to the List Ordering aspect than I had in mind originally. Maybe?

    Is it worth specifying that in doing the Sign' step, one actually sanity checks the full list of (Xj,mj) values extracted from ctx? Because with a coordinator that's untrusted, they could simply provide a different list and therefore different L that happens to pass the unique-entry check.

    It's a weird thing to talk about, I realize; one doesn't write 'check that the m-value you're signing is your actual message', either in single sig or multisig. It's part of the setup that you choose a message. In this aggregation scenario, we have the co-EUF-CMA game which expands 'chosen message attack' to 'chosen keys and messages list attack'. So now the 'list of keys and messages' is taking the place of what previously was just a single message, so you could reasonably slot that in and say 'well obviously I'm not signing if that list is wrong', but there is a nuance if you now use a coordinator, read that list from him, as opposed to reading it yourself from some setup state, and the spec specifically says 'check your entry in that list' - it might be inferred that you don't care what else is in the list (and perhaps in some circumstances, you don't, but in others you do).

    As you noted:

    In many applications, the signers already know the list of public keys and messages before the signing session starts and only the aggnonce and individual public nonces need to be communicated.

    ... in these cases my comment doesn't apply, clearly. One case where it could apply might be a spontaneously coordinated big coinjoin or batching. But then, since 459 is the sig scheme not the bitcoin specific part, we should be looking in general, not only at these applications.

    Also in the paper they do write:

    Yet another option would be to change the syntax so that Coord only takes the list of signers’ first-round outputs (R1,i,R2,i), but not the public keys and messages. The coordinator would simply compute R1 and R2 and output ctx = (R1,R2,(R2,i)i∈[n]). Then, we would also need to change Sign′ so that it takes public keys and messages of cosigners, but the question then is how each signer can link the values R2,j in the session context ctx and the cosigners’ pk/message pairs. It seems like it would require a unique id per signer, something that would be inconvenient and that our scheme avoids: packing Xi, mi, and R2,i in a single triple is the task of the coordinator.

    So I guess there are several, reasonable, slight variants. My only concern is that, coming from the Spec section of the paper, there's a hole that someone might miss and just accept any list that passes the uniqueness check, and go ahead and merrily sign.

    (if there is something to edit here, might want to look at 'Signer verification checks' under Security, too).

    Another detail worthy of consideration, I think, is that such checks are not EC operations, so not a concern even on constrained devices, right.

  23. real-or-random commented at 8:01 AM on August 17, 2026: contributor

    Yes, co-EUF-CMA gives you the guarantee that if you don't agree with what else is list, you can securely refuse to sign.

    and the spec specifically says 'check your entry in that list' - it might be inferred that you don't care what else is in the list (and perhaps in some circumstances, you don't, but in others you do).

    Yeah, the fact that you may care in some circumstances but not in all makes it particularly subtle to explain.

    As you point out, Sign in the spec gets m explicitly and can perform the check. But it doesn't get any other entry explicitly.

    I currently don't see a better way than explaining this in detail. The caller needs to check any condition in the list they would like to hold true (e.g., if they want some other pk_i to sign m_i, they need to check this).

    The only check that the scheme does for them is that their own pubkey signs m. We could even push this check to the user, but I don't think that's a great idea. Doing so would make the thing conceptually simpler, but it would introduce a footgun even for those callers who don't care about the rest of the list.

  24. bitcoin deleted a comment on Aug 17, 2026
  25. BIP459: Add DahLIAS fully aggregated signatures for secp256k1 be89e5e7b8
  26. BIP459: Add entry to the README index 9354ddb241
  27. fjahr force-pushed on Aug 17, 2026
  28. fjahr commented at 10:19 AM on August 17, 2026: contributor

    Thanks @AdamISZ and @real-or-random, makes sense to spell this out. In this push I have added notes to both the Sign section and in Security, clarifying that Sign only checks the signer's own entry and that any requirement on the rest of the list must be checked by the caller before signing.

  29. in bip-0459.mediawiki:75 in 9354ddb241
      70 | +Then, the signers send their partial signatures to the coordinator, who runs ''SigAgg'' to obtain the final 64-byte aggregate signature.
      71 | +If all signers behaved honestly, the result passes ''Verify''.
      72 | +If the aggregate signature is invalid, the coordinator can run ''PartialSigVerify'' on each partial signature to identify the disruptive signer.
      73 | +
      74 | +'''IMPORTANT''': The ''Sign'' algorithm must '''not''' be executed twice with the same ''secnonce''.
      75 | +Otherwise, it is possible to extract the signer's secret key from the two partial signatures output by the two executions of ''Sign''.
    


    w0xlt commented at 10:20 PM on August 20, 2026:

    This signing scheme uses two secret nonce scalars, unlike ordinary Schnorr signing. Two partial signatures provide only two equations in the three unknowns r_1, r_2, and d'.

    Maybe the following wording is clearer (while retaining the prohibition on any nonce reuse):

    diff --git a/bip-0459.mediawiki b/bip-0459.mediawiki
    index 622f9a6..64da1ac 100644
    --- a/bip-0459.mediawiki
    +++ b/bip-0459.mediawiki
    @@ -72,7 +72,7 @@ If all signers behaved honestly, the result passes ''Verify''.
     If the aggregate signature is invalid, the coordinator can run ''PartialSigVerify'' on each partial signature to identify the disruptive signer.
     
     '''IMPORTANT''': The ''Sign'' algorithm must '''not''' be executed twice with the same ''secnonce''.
    -Otherwise, it is possible to extract the signer's secret key from the two partial signatures output by the two executions of ''Sign''.
    +Otherwise, repeated partial signatures may reveal the signer's secret key; three suitably distinct executions of ''Sign'' with the same ''secnonce'' suffice for key extraction, as explained below.
     To avoid accidental reuse of ''secnonce'', an implementation may securely erase the ''secnonce'' argument by overwriting it with 64 zero bytes after it has been read by ''Sign''.
     A ''secnonce'' consisting of only zero bytes is invalid for ''Sign'' and will cause it to fail.
    
  30. in bip-0459/reference.py:47 in 9354ddb241
      42 | +
      43 | +#
      44 | +# Key Tweaking
      45 | +#
      46 | +
      47 | +def TweakSK(sk: Scalar, t: Scalar, is_xonly: bool) -> Scalar:
    


    w0xlt commented at 11:11 PM on August 20, 2026:

    The specification requires tweaking to fail when P' is infinity. Should the reference implementation and tweak vectors enforce this case as well?

    <details> <summary>diff</summary>

    diff --git a/bip-0459/gen_test_vectors.py b/bip-0459/gen_test_vectors.py
    index 2624b37..e18720b 100644
    --- a/bip-0459/gen_test_vectors.py
    +++ b/bip-0459/gen_test_vectors.py
    @@ -416,7 +416,7 @@ def gen_tweak_vectors(f):
         writer = csv.writer(f)
         writer.writerow((
             "index", "internal_secret_key", "tweak", "is_xonly",
    -        "expected_secret_key", "expected_pubkey", "comment",
    +        "expected_result", "expected_secret_key", "expected_pubkey", "comment",
         ))
     
         def row(idx, sk, t, is_xonly, comment):
    @@ -426,10 +426,24 @@ def gen_tweak_vectors(f):
             writer.writerow((
                 idx, sk.to_bytes().hex().upper(), t.to_bytes().hex().upper(),
                 "TRUE" if is_xonly else "FALSE",
    +            "TRUE",
                 sk_out.to_bytes().hex().upper(), pk_out.to_bytes_compressed().hex().upper(),
                 comment,
             ))
     
    +    def error_row(idx, sk, t, is_xonly, comment):
    +        for tweak_fn, key in ((TweakSK, sk), (TweakPK, sk * G)):
    +            try:
    +                tweak_fn(key, t, is_xonly)
    +            except ValueError:
    +                continue
    +            raise AssertionError(f"{tweak_fn.__name__} did not fail")
    +        writer.writerow((
    +            idx, sk.to_bytes().hex().upper(), t.to_bytes().hex().upper(),
    +            "TRUE" if is_xonly else "FALSE",
    +            "FALSE", "", "", comment,
    +        ))
    +
         sk1 = scalar_from_byte(1)
         even = sk1 if has_even_y(sk1 * G) else -sk1
         odd = -even
    @@ -438,6 +452,8 @@ def gen_tweak_vectors(f):
         row(1, odd, t, False, "Plain tweak of an odd-y key")
         row(2, even, t, True, "X-only tweak of an even-y key")
         row(3, odd, t, True, "X-only tweak of an odd-y key")
    +    error_row(4, odd, -odd, False, "Plain tweak resulting in the point at infinity")
    +    error_row(5, odd, odd, True, "X-only tweak resulting in the point at infinity")
     
     
     if __name__ == "__main__":
    diff --git a/bip-0459/reference.py b/bip-0459/reference.py
    index cd1cf59..bcf2e61 100644
    --- a/bip-0459/reference.py
    +++ b/bip-0459/reference.py
    @@ -46,13 +46,17 @@ def xbytes(P: GE) -> bytes:
     
     def TweakSK(sk: Scalar, t: Scalar, is_xonly: bool) -> Scalar:
         d = sk if (not is_xonly or has_even_y(sk * G)) else -sk
    -    return d + t
    +    tweaked_sk = d + t
    +    if tweaked_sk == 0:
    +        raise ValueError("tweaked secret key is zero")
    +    return tweaked_sk
     
     
     def TweakPK(pk: GE, t: Scalar, is_xonly: bool) -> GE:
         P = pk if (not is_xonly or has_even_y(pk)) else -pk
         Q = P + t * G
    -    assert not Q.infinity
    +    if Q.infinity:
    +        raise ValueError("tweaked public key is the point at infinity")
         return Q
     
     
    diff --git a/bip-0459/run_test_vectors.py b/bip-0459/run_test_vectors.py
    index 551f9b1..d445d89 100644
    --- a/bip-0459/run_test_vectors.py
    +++ b/bip-0459/run_test_vectors.py
    @@ -206,14 +206,29 @@ def run_tweak_tests() -> List[str]:
             next(reader)
     
             for row in reader:
    -            index, sk_str, t_str, is_xonly_str, exp_sk_str, exp_pk_str, comment = row
    +            (index, sk_str, t_str, is_xonly_str, expected_result,
    +             exp_sk_str, exp_pk_str, comment) = row
                 sk = Scalar.from_bytes_checked(bytes.fromhex(sk_str))
                 t = Scalar.from_bytes_checked(bytes.fromhex(t_str))
                 is_xonly = (is_xonly_str == "TRUE")
    -            sk_out = TweakSK(sk, t, is_xonly)
    -            pk_out = TweakPK(sk * G, t, is_xonly)
    -            if (sk_out.to_bytes().hex().upper() != exp_sk_str
    -                    or pk_out.to_bytes_compressed().hex().upper() != exp_pk_str):
    +
    +            try:
    +                sk_out = TweakSK(sk, t, is_xonly)
    +            except ValueError:
    +                sk_out = None
    +            try:
    +                pk_out = TweakPK(sk * G, t, is_xonly)
    +            except ValueError:
    +                pk_out = None
    +
    +            if expected_result == "TRUE":
    +                matches = (sk_out is not None
    +                           and pk_out is not None
    +                           and sk_out.to_bytes().hex().upper() == exp_sk_str
    +                           and pk_out.to_bytes_compressed().hex().upper() == exp_pk_str)
    +            else:
    +                matches = sk_out is None and pk_out is None
    +            if not matches:
                     failures.append(f"Tweak #{index}: {comment}")
     
         return failures
    diff --git a/bip-0459/vectors/test_vectors_tweak.csv b/bip-0459/vectors/test_vectors_tweak.csv
    index fcaa22b..4e3e544 100644
    --- a/bip-0459/vectors/test_vectors_tweak.csv
    +++ b/bip-0459/vectors/test_vectors_tweak.csv
    @@ -1,5 +1,7 @@
    -index,internal_secret_key,tweak,is_xonly,expected_secret_key,expected_pubkey,comment
    -0,FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDB9ADDBE5AE479F3ABED15D8BCF354040,0202020202020202020202020202020202020202020202020202020202020202,FALSE,0101010101010101010101010101010101010101010101010101010101010101,031B84C5567B126440995D3ED5AABA0565D71E1834604819FF9C17F5E9D5DD078F,Plain tweak of an even-y key
    -1,0101010101010101010101010101010101010101010101010101010101010101,0202020202020202020202020202020202020202020202020202020202020202,FALSE,0303030303030303030303030303030303030303030303030303030303030303,02531FE6068134503D2723133227C867AC8FA6C83C537E9A44C3C5BDBDCB1FE337,Plain tweak of an odd-y key
    -2,FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDB9ADDBE5AE479F3ABED15D8BCF354040,0202020202020202020202020202020202020202020202020202020202020202,TRUE,0101010101010101010101010101010101010101010101010101010101010101,031B84C5567B126440995D3ED5AABA0565D71E1834604819FF9C17F5E9D5DD078F,X-only tweak of an even-y key
    -3,0101010101010101010101010101010101010101010101010101010101010101,0202020202020202020202020202020202020202020202020202020202020202,TRUE,0101010101010101010101010101010101010101010101010101010101010101,031B84C5567B126440995D3ED5AABA0565D71E1834604819FF9C17F5E9D5DD078F,X-only tweak of an odd-y key
    +index,internal_secret_key,tweak,is_xonly,expected_result,expected_secret_key,expected_pubkey,comment
    +0,FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDB9ADDBE5AE479F3ABED15D8BCF354040,0202020202020202020202020202020202020202020202020202020202020202,FALSE,TRUE,0101010101010101010101010101010101010101010101010101010101010101,031B84C5567B126440995D3ED5AABA0565D71E1834604819FF9C17F5E9D5DD078F,Plain tweak of an even-y key
    +1,0101010101010101010101010101010101010101010101010101010101010101,0202020202020202020202020202020202020202020202020202020202020202,FALSE,TRUE,0303030303030303030303030303030303030303030303030303030303030303,02531FE6068134503D2723133227C867AC8FA6C83C537E9A44C3C5BDBDCB1FE337,Plain tweak of an odd-y key
    +2,FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDB9ADDBE5AE479F3ABED15D8BCF354040,0202020202020202020202020202020202020202020202020202020202020202,TRUE,TRUE,0101010101010101010101010101010101010101010101010101010101010101,031B84C5567B126440995D3ED5AABA0565D71E1834604819FF9C17F5E9D5DD078F,X-only tweak of an even-y key
    +3,0101010101010101010101010101010101010101010101010101010101010101,0202020202020202020202020202020202020202020202020202020202020202,TRUE,TRUE,0101010101010101010101010101010101010101010101010101010101010101,031B84C5567B126440995D3ED5AABA0565D71E1834604819FF9C17F5E9D5DD078F,X-only tweak of an odd-y key
    +4,0101010101010101010101010101010101010101010101010101010101010101,FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFDB9ADDBE5AE479F3ABED15D8BCF354040,FALSE,FALSE,,,Plain tweak resulting in the point at infinity
    +5,0101010101010101010101010101010101010101010101010101010101010101,0101010101010101010101010101010101010101010101010101010101010101,TRUE,FALSE,,,X-only tweak resulting in the point at infinity
    

    </details>


github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bips. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-08-23 22:10 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me