BIP 47 (Reusable Payment Codes for HD Wallets)

Difficoltà: avanzato

Argomento: tecnologia


DEFINIZIONE

Il BIP47 è un BIP Bitcoin Improvement Proposal o proposta di miglioramento bitcoin, per creare codici di pagamento riutilizzabili, proteggendo la privacy degli utenti per i pagamenti ricorrenti.
Senza il BIP47, gli utenti devono generare manualmente nuovi indirizzi per evitare l'Address reuse o la riutilizzazione di indirizzi.

Quando un utente riutilizza un indirizzo per le transazioni, consente a chiunque stia osservando la blockchain di raggruppare facilmente tutte le transazioni appartenenti all'indirizzo riutilizzato e formare un grafico della storia dei pagamenti dell'utente e del suo patrimonio.
Prevenire la riutilizzazione degli indirizzi è quindi una pratica migliore per la privacy in Bitcoin e già implementata in molte wallet Bitcoin per impostazione predefinita.
Tuttavia, quando un utente vuole stabilire pagamenti ricorrenti con un'altra parte, come in una relazione commerciante-cliente, la generazione frequente di nuovi indirizzi può essere scomoda.

Con il BIP47, un cliente può generare un set di indirizzi da utilizzare per i pagamenti per il commerciante. Se un cliente acquista prodotti mensilmente, il commerciante dovrebbe inviare al cliente un indirizzo ogni mese. Con il BIP47, il cliente crea un codice di pagamento dedicato per il commerciante, che funziona in modo simile a una chiave pubblica estesa.
Ciò consente al cliente di generare automaticamente nuovi indirizzi per il commerciante, invece che il commerciante dover creare indirizzi per il cliente.

Il BIP47 utilizza gli indirizzi di notifica, che sono monitorati dai wallet HD per gli output. In una transazione di notifica, il commerciante invia al cliente una blinded public key, una chiave pubblica offuscata, e un codice di catena tramite il campo OP_RETURN, insieme a un segreto condiviso per mantenere privati gli indirizzi condivisi sulla blockchain pubblica.
Questo scambio crea diversi problemi a causa dell'architettura della rete Bitcoin. I primi due sono economici: una transazione di notifica consiste in 80 byte, che possono diventare costosi per gli utenti quando le commissioni sulla rete Bitcoin sono alte. Le transazioni di notifica, inoltre, creano output non inviabili, che gonfiano l'UTXO Set nel tempo. Ciò aumenta il carico di calcolo sui nodi Bitcoin che, al momento, devono memorizzare l'intero UTXO Set, ovvero ogni output Bitcoin che non è stato utilizzato come nuovo input per garantire la validità delle transazioni.

BIP47 definisce lo standard per la creazione di un codice di pagamento che può essere pubblicizzato pubblicamente e associato a un'identità reale (o a uno pseudonimo) senza creare la perdita di sicurezza o di privacy insita nel riutilizzo degli indirizzi.

A differenza dei normali indirizzi Bitcoin, un codice di pagamento BIP47 viene utilizzato tra le parti coinvolte (mittente e destinatario) per generare un nuovo indirizzo ogni volta che viene effettuato un pagamento, evitando il riutilizzo degli indirizzi.

Il BIP47 non definisce un tipo di indirizzo, ma definisce un modo per un utente di generare indirizzi che possano essere usati da un altro utente senza dover interagire direttamente con lui e conoscendo solo il suo codice di pagamento pubblico.

A luglio 2022, gli unici wallet che supportano BIP47 sono Samourai e Sparrow. Tuttavia, è in corso lo sviluppo di implementazioni in BDK e BlueWallet.

Ecco un breve riassunto di come funziona. Nell'esempio, Alice paga Bob:

  1. Alice riceve il codice di pagamento di Bob. Oltre ad alcuni metadati, questo codice contiene l'xpub di Bob al Derivation Path 47;
  2. Alice prepara una transazione di notifica. Sceglie uno dei suoi UTXO e crea un segreto condiviso S = k.B, dove k è la chiave privata di uno dei suoi UTXO e B è la prima chiave pubblica dell'xpub di Bob. Cifra il proprio codice di pagamento applicando lo XOR tra il proprio codice e HMAC-SHA512(o, Sx), dove o è il precedente punto di uscita dell'UTXO e Sx è la coordinata X di S;
  3. Invia la transazione all'indirizzo di notifica di Bob, che è il primo indirizzo dell'xpub di Bob, includendo il suo codice di pagamento criptato nell'OP_RETURN;
  4. Bob legge l'OP_RETURN e trova S = b.K, dove b è la chiave privata di B e K la chiave pubblica di k. Bob ottiene K e o dalla transazione di notifica. Con queste informazioni è in grado di recuperare il codice di pagamento di Alice;
  5. Alice può ora ricavare nuovi indirizzi e inviare pagamenti a Bob moltiplicando la chiave privata a dal suo codice di pagamento e le chiavi pubbliche B0, B1, B2 ecc. di Bob dal suo codice di pagamento.
    Bob farà il contrario: b0.A, b1.A, b2.A ecc;


aggiornato il 2022-07-26