ECDH e Tweak: La Matematica degli SP
BIP352 Under the Hood con implementazione Python
Alice ha chiave privata a, chiave pubblica A. Bob ha chiave pubblica B. Alice calcola P = B + hash(a·B)·G. Solo Bob, conoscendo b, puo calcolare b·A e quindi trovare P. Nessuno altro puo.
L'operazione a·B (Alice) e b·A (Bob) danno lo stesso punto segreto perche a·b·G = b·a·G. Questo e l'ECDH.
Se Alice riusa lo stesso UTXO, genera lo stesso indirizzo. Il protocollo aggiunge input_hash che include l'outpoint della transazione: cosi ogni tx e unica anche con la stessa chiave.
Bob vuole dividere il pagamento? Alice introduce un contatore k: P_k = B + hash(a·B || k)·G. Bob riconosce entrambi.
Scan key: trova i pagamenti (pubblica, online). Spend key: spende i fondi (privata, offline). La separazione e architetturale: chi scansiona non puo spendere.
Bob vuole sapere chi gli ha pagato? Usa label numerate: B_m = B_spend + hash(b_scan || m)·G. Ogni m e un mittente diverso, tutti scansionabili con una sola scan key.
L'implementazione di riferimento in Python usa secp256k1lab. Le funzioni chiave sono: somma chiavi private, normalizzazione Taproot, verifica checksum. Vedi il repository BIP352.
Input misti: wallet deve estrarre chiavi pubbliche da P2PKH, P2WPKH, P2SH-P2WPKH, P2TR. Non tutti gli input hanno la chiave esposta uguale.
P2SH: non valido perche nasconde la chiave fino alla spesa. BIP352 richiede chiavi visibili in input.
- Mittente: somma A di tutti i propri input.
- Calcola ECDH a·B con scan key di Bob.
- Applica input_hash per unicita.
- Deriva P = B + hash(tweak)·G.
- Destinatario: scansiona, trova P, spende con spend key.
BIP352 e una triade: ECDH per il segreto condiviso, input_hash per l'unicita, scan/spend separation per la sicurezza. Conceptualmente semplice, architetturalmente elegante.