Przejdź do treści
Biblioteka skilli
Programowanie · Nauka i wyjaśnianie

bitcoin-ecdsa

/bitcoin-ecdsa

Opisuje podpisy ECDSA na krzywej secp256k1: podpisywanie i weryfikację, deterministyczne k (RFC6979), low-s, kodowanie DER, plastyczność i podpisy odzyskiwalne.

Licencja
MIT
Ostatnia zmiana repozytorium
21.10.2026

Ocena i bezpieczeństwo

95/ 100Klasa: dobry
Format20 / 25
Frontmatter z nazwą i opisem, poprawna nazwa, opis do 1024 znaków, nazwa zgodna z folderem.
Odkrywalność25 / 25
Opis mówi, kiedy użyć skilla, ma sensowną długość i jest w 3. osobie.
Treść35 / 35
Co najmniej 150 słów i do 500 linii, nagłówki, listy kroków, przykłady albo kod.
Higiena15 / 15
Bez zaślepek typu TODO, bez ścieżek Windows, z licencją.
Ryzykobrak sygnałów w skanie
Pliki w paczce
1
Skrypty
0
Komentarze HTML
0
Adresy URL w SKILL.md
0
Przestarzałość

Brak sygnałów. Repozytorium zmienione 21.10.2026, bez odwołań do wycofanych modeli i API.

Licencja

MIT, otwarta: można używać i zmieniać, z zachowaniem informacji o autorze.

Co robi i kiedy

Opisuje podpisy ECDSA na krzywej secp256k1: podpisywanie i weryfikację, deterministyczne k (RFC6979), low-s, kodowanie DER, plastyczność i podpisy odzyskiwalne.

Wyzwalacze z opisu

non-canonical signature
Oryginalny opis (EN)

ECDSA signatures over secp256k1: sign/verify, deterministic-k (RFC6979), low-s (BIP146), DER encoding, malleability, recoverable signatures. USE WHEN: signing legacy/SegWit-v0 inputs, verifying legacy signatures, debugging "non-canonical signature" errors.

Jak działa

  1. Sign (private key d, message hash h)
  2. Verify (public key Q, message hash h, signature (r, s))
  3. Deterministic k (RFC6979)
  4. DER encoding (for tx witness)
  5. Strict DER (BIP66)
  6. Low-s (BIP146)
  7. Recoverable signatures
  8. Common errors
  9. See also
Sekcje z nagłówków SKILL.md, w oryginale · 110 linii, 549 słów
Podgląd SKILL.md
---
name: bitcoin-ecdsa
description: |
  ECDSA signatures over secp256k1: sign/verify, deterministic-k (RFC6979),
  low-s (BIP146), DER encoding, malleability, recoverable signatures.
  USE WHEN: signing legacy/SegWit-v0 inputs, verifying legacy signatures,
  debugging "non-canonical signature" errors.
allowed-tools: Read, Grep, Glob
---

# ECDSA on secp256k1

ECDSA is the original Bitcoin signature scheme. Used for legacy P2PKH,
P2SH, and SegWit v0 (P2WPKH/P2WSH). Replaced by Schnorr in Taproot.

## Sign (private key d, message hash h)

```
1. Generate nonce k ∈ [1, n-1].
2. R = k * G
3. r = R.x mod n.    if r == 0, retry.
4. s = k^(-1) * (h + r*d)  mod n.   if s == 0, retry.
5. Apply low-s normalization: if s > n/2, s = n - s.   (BIP146)
6. Output (r, s).
```

The signature is `(r, s)` ∈ Z_n × Z_n.

## Verify (public key Q, message hash h, signature (r, s))

```
1. Check r, s ∈ [1, n-1].
2. w = s^(-1) mod n.
3. u1 = h * w mod n,  u2 = r * w mod n.
4. P = u1*G + u2*Q.
5. Verify P.x mod n == r.
```

## Deterministic k (RFC6979)

**CRITICAL**: never reuse k. If you sign two different messages with
the same k, the private key leaks.

```
d * (s1 - s2) = k * (h2 - h1)  (mod n)
→ d = (s1 - s2)^(-1) * (h2 - h1) * k  (mod n)
```

RFC6979 derives `k` deterministically from `(d, h)` via HMAC-SHA256.
Bitcoin libraries default to RFC6979 — never accept "user-provided"
k unless you implement extra randomness mixing (RFC6979 + extra entropy
pattern, used by some hardware wallets to defeat fault attacks).

## DER encoding (for tx witness)

Bitcoin Script uses ASN.1 DER:
```
30 LL 02 LR <r> 02 LS <s>
```
Where:
- `30` = SEQUENCE tag.
- `LL` = total length following.
- `02` = INTEGER tag.
- `LR` / `LS` = length of r / s.
- `<r>` / `<s>` = big-endian, with leading 0x00 byte if high bit set
  (DER strict).

Followed by 1-byte sighash flag in tx witness:
```
<DER signature> <sighash byte>
```

Total length typically 71-72 bytes.

## Strict DER (BIP66)

Bitcoin Core enforces strict DER since 2015 to defeat malleability:
- No extra leading bytes.
- Length fields exactly minimal.
- Integers must be DER-canonical.

Non-DER signatures are rejected at script execution.

## Low-s (BIP146)

Both `(r, s)` and `(r, n-s)` verify against the same message and key.
This is malleability. BIP146 enforces `s ≤ n/2` as standard policy
(strictly enforced in Tapscript and as standard in segwit; mempool
rejects but consensus historically accepts both forms).

## Recoverable signatures

A 65-byte ECDSA encoding `<header byte> r s` lets verifier recover the
public key from the signature alone:
- `header` byte = `27 + recovery_id + (4 if compressed pubkey)`.
- `recovery_id ∈ [0, 3]`: encodes which of (R, -R, R+n, -R+n) to use.

Used by:
- BIP137 message signing.
- Lightning gossip messages (signed announcements).
- Some Ethereum-bridge tools (`ecrecover`).

Not used in raw tx witness (regular DER is more compact for that).

## Common errors

- Reusing k → key leak. **Never** accept an external nonce.
- Skipping low-s normalization → mempool rejection.
- Including a high-s signature in standardness-strict mempools → tx
  goes nowhere.
- Off-by-one in DER length encoding (the most common DER bug).
- Confusing nonce `k` with private key `d` in code reviews.

## See also

- [secp256k1/SKILL.md](../secp256k1/SKILL.md)
- [schnorr/SKILL.md](../schnorr/SKILL.md)
- [../../protocol/transactions/quick-ref/sighash.md](../../protocol/transactions/quick-ref/sighash.md)

Wersje

W bazie nie ma innych skilli o nazwie bitcoin-ecdsa.

Migawka bazy z 28.10.2026 · wersja paczki acecb3fca9b9 (skrót SHA-256 całej paczki)

Zgłoś problem z tym skillem: szkodliwa treść, błędny opis albo prośba autora o usunięcie.

Podobne skille

  • 95bitcoin-libraries-secp256k1-rs
    Wspiera niskopoziomową kryptografię w Rust z rust-secp256k1: ECDSA, Schnorr, ECDH, tweaking kluczy i MuSig2 (BIP327).
  • 100micro-ecc-integration
    Pomaga zintegrować, przenieść i debugować bibliotekę micro-ecc (uECC) na mikrokontrolerze: ECDH, ECDSA, generowanie kluczy, wybór krzywej i formaty bajtów.
  • 100signature-malleability
    Wykrywa podatności podpisów ECDSA i pułapki ecrecover: brak wymuszenia low-s, niezwiązany v, adres zerowy i ponowne użycie podpisu.
  • 93bitcoin-message-signing
    Obsługuje podpisywanie wiadomości Bitcoin według BIP137 (tylko legacy P2PKH) i BIP322 (dowolny typ wyjścia) do dowodu własności adresu, weryfikacji wypłat i uwierzytelniania.
  • 100circle-webhooks
    Odbiera i weryfikuje webhooki Circle Payments Network v2, w tym podpisy ECDSA (X-Circle-Signature, X-Circle-Key-Id), oraz obsługuje powiadomienia cpn.payment, cpn.transaction i cpn.rfi.
  • 85sodax-wallet-sdk-core-bitcoin
    Podpisuje PSBT i wiadomości Bitcoin w backendzie lub skryptach Node przez BitcoinWalletProvider, bez komponentów React.

Uwagi i zgłoszenia

Wiadomość trafi do Bartosza Sokolińskiego. Adres e-mail jest potrzebny tylko do odpowiedzi. Szczegóły w polityce prywatności.