Glossario / Indirizzi e chiavi
Derivazione BIP-49
- Che cos'è la derivazione BIP-49?
- La derivazione BIP-49 colloca i conti SegWit annidati su un ramo dedicato in m/49'/0'/0', così un wallet che non riesce a leggerli non mostra nulla invece di un saldo errato.
Specificato nel BIP-49.
BIP-49 riserva il primo livello indurito dell'albero delle chiavi, 49', ai conti i cui indirizzi sono P2WPKH racchiusi dentro P2SH. È stato assegnato il 19 maggio 2016 e in seguito ha ottenuto i propri byte di versione per le chiavi estese, 0x049d7cb2 per ypub e 0x049d7878 per yprv. Se il tuo wallet esporta una chiave di conto che inizia con ypub, quello è il ramo che un ripristino deve percorrere.
Come funziona
BIP-49 risolve due questioni: quale ramo di un albero BIP-32 contiene le chiavi SegWit annidate e come si costruisce un indirizzo da una chiave su quel ramo.
Il ramo riprende il modello a cinque livelli che BIP-44 usava già, m / purpose' / coin_type' / account' / change / address_index, e cambia esattamente un numero. Il purpose diventa 49' invece di 44'. Coin type, conto, catena e indice mantengono i significati che BIP-44 aveva dato loro.
La parte dell'indirizzo è meccanica: si calcola l'hash della chiave pubblica compressa, si racchiude il risultato di 20 byte in un redeem script di 22 byte, poi si calcola l'hash di quello script per ottenere ciò a cui l'output si impegna. La specifica scrive i due pezzi come scriptSig: 0x160014{20-byte-key-hash} e scriptPubKey: 0xA914{20-byte-script-hash}87.
La parte interessante è l'opzione che l'autore ha scartato. Weigl elenca due approcci: mantenere il conto che già hai e agganciare gli indirizzi SegWit annidati alle stesse chiavi pubbliche, oppure creare conti dedicati sotto un nuovo purpose. Il primo è più comodo finché qualcosa non va storto, e allora, nelle parole della specifica, il conto "might show up but also it might miss some UTXOs". BIP-49 ha scelto i conti dedicati proprio perché quell'opzione "fails in a more visible way". Una schermata vuota è un messaggio di errore migliore di un numero sbagliato ma plausibile.
La serializzazione ha ricevuto lo stesso trattamento, alla fine: le chiavi pubbliche estese su questo ramo usano i byte di versione 0x049d7cb2, che in base58 danno il prefisso ypub, con 0x049d7878 per yprv e upub e uprv sulla testnet.
Dove lo vedi
BIP-49 si presenta come una chiave estesa che inizia con ypub invece di xpub, e come il conto SegWit annidato che un wallet elenca accanto a quello nativo. Mycelium, che questo sito valuta 3,7, porta conti SegWit nativi e annidati in un'unica app, i due schemi che SLIP-0132 registra sotto zpub e ypub.
Il prefisso ypub è stato aggiunto in un secondo momento, e quella storia si vede ancora. BIP-43, che ha inventato il livello purpose nel 2014, diceva agli implementatori di mantenere 0x0488B21E e il prefisso xpub per ogni purpose. BIP-49 è uscito così all'inizio, e SLIP-0132, creato l'8 febbraio 2018 per registrare i byte di versione come si deve, descrive il risultato senza giri di parole: il prefisso invariato ha portato a "unsustainable user confusion", perché o l'utente doveva ricordare da quale ramo veniva una xpub, oppure lo strumento ricevente doveva scansionare entrambi gli spazi di indirizzi. Un prefisso è un indizio, non una garanzia. Se incolli una chiave estesa in un block explorer e questo deriva indirizzi che iniziano con 1 mentre il tuo wallet mostra indirizzi che iniziano con 3, hai tra le mani una chiave BIP-49 con il prefisso più vecchio, e bisogna indicare il percorso allo strumento a mano.
La specifica include un vettore di test per la testnet su cui vale la pena verificare uno strumento: la frase abandon ripetuta undici volte seguita da about, radice del conto m/49'/1'/0', primo indirizzo di ricezione 2Mww8dCYPUpKHofjgcXcBCEGmniw9CoaiD2.
Derivazione BIP-49 vs SegWit annidato
La derivazione BIP-49 è una regola sulle chiavi, e il SegWit annidato è uno schema che la catena vede; i due di solito viaggiano insieme, ma nessuno dei due implica l'altro. Un output è SegWit annidato per lo script a cui si impegna, e nulla in esso registra quale percorso ha prodotto la chiave. Un wallet può costruirne uno da una chiave privata importata, o con l'approccio che BIP-49 ha scartato, che derivava un secondo indirizzo P2SH da chiavi pubbliche già presenti in un conto BIP-44. Sapere che i tuoi bitcoin sono su indirizzi 3 non ti dice quindi dove ripristinare, ed è per questo che il percorso del conto va annotato accanto al backup della frase di recupero.