Glossario / Riferimento per sviluppatori
Funzione di punto
- Che cos'è la funzione di punto?
- La funzione di punto trasforma una chiave privata in una chiave pubblica moltiplicando il punto generatore di secp256k1 per quel numero, ed è il passo unidirezionale su cui si costruisce ogni indirizzo bitcoin.
Specificato nel BIP-32.
Il BIP32 dà un nome all'operazione, point(p), perché la derivazione gerarchica delle chiavi la richiama quasi a ogni riga. Moltiplica il generatore fisso della curva per un segreto di 256 bit e il risultato è una coppia di coordinate che puoi pubblicare senza rischi; risalire al segreto da quella coppia significa risolvere un logaritmo discreto in uno spazio di 78 cifre. Il tuo wallet esegue la funzione una volta per indirizzo e non deve mai eseguirla al contrario.
Come funziona
La funzione di punto è una moltiplicazione su curva ellittica con uno dei due input fissato per sempre.
Bitcoin usa la curva secp256k1, definita dall'equazione y al quadrato uguale a x al cubo più 7 su un grande campo primo, e standardizzata nel documento SEC 2 e non dal NIST. La curva arriva con un punto generatore G che ogni implementazione incorpora nel codice, e con un ordine del gruppo n il cui valore sta appena sotto 2 elevato alla 256. Una chiave privata è un qualsiasi intero da 1 fino a n meno 1. La funzione somma G a se stesso quel numero di volte con una scala di raddoppi e addizioni, che termina in molto meno di un millisecondo e non nell'età dell'universo.
Il senso inverso è l'intera ipotesi di sicurezza. Dato il punto risultante, nessun metodo pubblicato recupera il moltiplicatore più velocemente di circa la radice quadrata della dimensione del gruppo, il che porta il lavoro a circa 2 elevato alla 128 operazioni. Nulla di questo cambia se un indirizzo viene riutilizzato, pubblicato o conservato per decenni.
Una proprietà rende possibili i wallet gerarchici. La moltiplicazione per un punto è distributiva rispetto all'addizione, quindi il punto di a più b è uguale al punto di a sommato al punto di b. Aggiungi un tweak a una chiave privata e la chiave pubblica corrispondente si sposta del punto di quel tweak, una quantità che chiunque può calcolare senza disporre della chiave. La derivazione BIP32 non hardened si basa su questa identità, e così la chiave di output di Taproot, che è una chiave interna spostata di un commitment a un albero di script.
Dove lo vedi
La funzione di punto viene eseguita ogni volta che un wallet ti mostra un nuovo indirizzo di ricezione.
È anche il motivo per cui una chiave pubblica estesa è utile da sola. Affida una xpub a un negozio online o a uno smartphone di sola lettura e quella macchina può generare un nuovo indirizzo per ogni pagamento applicando un tweak a una chiave pubblica, senza alcuna chiave privata presente. I wallet hardware sfruttano la stessa asimmetria dall'altro lato: il segreto non lascia mai il chip e solo il punto risultante torna indietro lungo il cavo.
La proprietà ha un aspetto insidioso. Poiché la relazione è additiva e pubblica, una chiave pubblica estesa combinata con una sola chiave privata figlia non hardened divulgata consente a chiunque di recuperare la chiave privata genitore e con essa l'intero ramo. È per questo che la derivazione a livello di conto è hardened, e che una xpub divulgata è un disastro per la privacy e non un furto immediato.
Funzione di punto vs chiave pubblica compressa
La funzione di punto produce un oggetto matematico; una chiave pubblica compressa è un modo di scrivere quell'oggetto. Un punto è una coppia di coordinate, ciascuna di 32 byte. La forma compressa scarta la coordinata y e conserva un prefisso di un byte che registra se era pari o dispari, per 33 byte in totale. La forma non compressa esplicita entrambe le coordinate su 65 byte. La forma x-only di Taproot conserva 32 byte e nessun prefisso. Ognuna di esse descrive lo stesso punto, eppure ogni codifica produce l'hash di un indirizzo diverso, ed è per questo che importare una vecchia chiave con il flag di compressione sbagliato mostra un saldo di zero mentre i bitcoin restano intatti all'altro indirizzo.