Derivation Path

Percorso di derivazione

Difficoltà: intermedio

Argomento: tecnologia


DEFINIZIONE

Il Derivation Path, o percorso di derivazione, è una sequenza di valori utilizzata dai Wallet HD per descrivere la creazione delle diverse chiavi partendo dal seed o dalla Master Key.

La derivazione delle chiavi effettuata dai wallet HD (Hierarchical Deterministic) "inventata" nel 2012 da Pieter Wuille con il BIP32 può essere fatta in molti modi, e si è evoluta nel corso del tempo al punto che il derivation path specificato nel BIP32, composto da una sequenza di campi separati da una barra (slash) del tipo m/0'/0/0 è ormai considerato deprecato.

Man mano che si sono generati nuovi tipi di indirizzi (per non parlare di altre criptovalute), i wallet si sono evoluti e nonostante siano stati fatti grandi progressi in termini di interoperabilità e per il ripristino, gli sviluppatori di wallet continuano a costruire wallet che:

  • non implementano gli standard BIP
  • implementano uno o più standard BIP, ma in modo incoerente rispetto ad altri portafogli.
  • implementano uno standard BIP, ma che non è stato ampiamente adottato
  • o addirittura creano un sistema usato solo da loro, vedi il caso di Electrum
  • non hanno una documentazione chiara sui loro derivation path e sui processi di backup e ripristino

Il Derivation Path viene rappresentato come una stringa di questo tipo:

  • legacy: m/i/0/0 basato sull'esempio nel BIP32, non è più utilizzato e non ci sono hardware wallet moderni che lo supportano nativamente. Software come Bitcoin Core possono supportarlo ma non lo utilizzano di default
  • standard parziale: m/84'/0'/0' utilizzato per la generazione degli indirizzi. È necessario conoscerlo, insieme alla xpriv, per poter generare gli indirizzi del proprio wallet
  • standard completo: m/84'/0'/0'/0/0 rappresenta uno specifico indirizzo. Ogni singolo indirizzo generato (o meglio derivato dalla chiave hd) dal wallet hd, ha questo formato e l'ultima cifra rappresenta il progressivo dell'indirizzo generato. Ad esempio m/84'/0'/0'/0/3 è il quarto indirizzo nella propria lista

inizialmente descritta nel BIP44.

I campi della sequenza hanno un ruolo per specificare come vengono generate le diverse chiavi private.

Purtroppo le diverse implementazioni effettuate dagli sviluppatori di wallet non seguono le stesse modalità, nel corso del tempo sono nati degli standard che non sono adottati allo stesso modo dai produttori di wallet, e questo fa in modo che non sempre sia semplice o addirittura possibile ripristinare un back up da un wallet ad uno di un altro sviluppatore.

Anche i wallet che fanno riferimento al BIP44 possono aver interpretato l'implementazione in modo inconsistente.

I campi della sequenza sono i seguenti:

m / purpose’ / coin_type’ / account’ / change / address_index

  • m: è la lettera iniziale che indica il tipo di master key. La lettera m minuscola indica master extended private key, o xprv, e la M maiuscola per i derivation paths per la xpub, la master extended public key.

  • Purpose, Scopo: Questo campo, che è stato aggiunto con il BIP43, indica quale standard di derivazione viene utilizzato. Le possibilità possono essere:

    • 0 ormai deprecata, è la specifica del percorso di derivazione originale specificata nel BIP 32
    • 44 che si riferiscono agli indirizzi BIP44 P2PKH, gli indirizzi legacy che iniziano con '1'
    • 49 riferito a BIP49 P2WPKH-nested-in-P2SH / indirizzi SegWit che iniziano con '3'
    • 84 riferito a BIP84 P2WPKH / indirizzi SegWit nativi che iniziano con 'bc1'.
    • 86 riferito a BIP86 P2TR / indirizzi Taproot
    • 45 che si riferiscono ai wallet multi-party multi-signature BIP45 P2SH (proposta)
    • 47 che si riferiscono ai codici di pagamento riutilizzabili del BIP47,
    • 48 riferito ai wallet hardware a firma multipla

Alcuni wallet ne supportano più di uno. Ad esempio, molti wallet ora hanno sia il tipo di indirizzo legacy che quello wrapped o nativo SegWit.

  • Coin Type, Tipo di moneta: il derivation type può essere utilizzato su bitcoin e altre criptovalute. Questo campo indica il tipo di criptovaluta, sulla base di un indice. Ad esempio lo 0 indica Bitcoin, 1 testnet, 60 Ethereum (ETH). Vedi la lista dei tipi di Coin Type su SLIP-0044 : Registered coin types for BIP-0044 Notare che il BIP45 indica invece questo livello come "Cosigner Index", l'indice della parte che crea un indirizzo multisig P2SH.

  • Account, Conto: Questo campo, in un wallet multi-account, indica l'identità o la collezione di indirizzi, che consente agli utenti di tenere conti separati per scopi diversi (es. risparmi, donazioni). Notare che il BIP45 non include questo campo. Il BIP47 attribuisce questo livello alla funzione di "Identità" che si può considerare equivalente a "Conto".

  • Change: 0 per Receive, 1 per Change. Questo campo, se è presente la costante 0, indica gli indirizzi "external chain" (regolari); se la costante 1, indica gli indirizzi "internal chain" o Change. Si noti che il BIP47 indicava questo livello per notification key e i codici di pagamento ephemeral.

  • Address Index, Indice indirizzo: Questo campo indica il numero di indirizzo specifico in una sequenza, all'interno di un conto.

Notare che i campi "account" e "address_index" iniziano con zero (0). Analogamente a quanto succede nei linguaggi di programmazione nei quali il primo elemento di un array ha 0 come indice.

Esempio pratico: Un utente ha un wallet bitcoin conforme a BIP44 e vuole individuare il secondo indirizzo nel suo terzo account. Il derivation path per il secondo indirizzo di nel terzo conto sarebbe il seguente: m/44'/0'/2'/1/1.

Un altro elemento di confusione può verificarsi quando i wallet utilizzano lo stesso derivation path per diversi tipi di script. Soprattutto se si utilizzano tipi di script più nuovi o innovativi, i wallet che hanno destinato tali percorsi ad altri script possono causare errori durante l'importazione.


aggiornato il 2022-07-18