Come funziona —Aperture

Sotto il cofano

Codice reale.
Vera sicurezza.

Questo è esattamente ciò che accade sul tuo dispositivo quando crei un portafoglio, ne ripristini uno e sposti i fondi: tracciato, passo dopo passo, attraverso il codice open source in esecuzione sul tuo iPhone.

1 / 5

128 bit di vera casualità

Il sistema CSPRNG produce entropia grezza sul tuo dispositivo, l'unica fonte del tuo intero portafoglio.

// 128 bit di entropia dal sistema CSPRNG
var entropia = Dati (conteggio: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropia)
// checksum = primi bit di SHA-256(entropia)
lascia che checksum = SHA256.hash(dati: entropia).prefix(1)
Sia bit = entropia + checksum
// mappa ogni gruppo da 11 bit all'elenco di parole BIP-39
let mnemonico = bits.chunks(di: 11)
.map { lista parole[$0] } // 12 parole
// allunga a un seed da 512 bit (PBKDF2-HMAC-SHA512)
let seed = PBKDF2.sha512(mnemonic.joined(" "),
sale: "mnemonico", giri: 2048)
// sigilla loSecure Enclave: non se ne va mai
prova Portachiavi.store(seed, accesso:.thisDeviceOnly,
biometria:.faceID)
1 / 4

Scrivi la tua frase

Viene inserito localmente e non viene mai trasmesso da nessuna parte.

// leggi la frase digitata: mai trasmessa
let parole = frase.minuscolo().split(" ")
// ogni parola deve esistere nell'elenco BIP-39
guardia parole.allSatisfy(wordlist.contains)
else { lancia WalletError.unknownWord }
// ricalcola e verifica il checksum
let (entropia, somma) = parole.toEntropia()
guardia SHA256.hash(dati: entropia).verifica(somma)
else { lancia WalletError.badChecksum }
// stessa derivazione della generazione: completamente offline
lascia seme = PBKDF2.sha512(parole.joined(" "),
sale: "mnemonico", giri: 2048)
prova Portachiavi.store(seed, accesso:.thisDeviceOnly)
1 / 3

Le tue monete sono selezionate

Gli input provengono dai tuoi output non spesi: nessuna terza parte è coinvolta.

// preleva monete dai tuoi output non spesi
let input = wallet.selectUTXOs(importo + commissione)
// crea la transazione interamente sul dispositivo
lascia che tx = TxBuilder(.bitcoin)
.aggiungi(input)
.send(importo, a: destinatario)
.change(a: portafoglio.changeAddress).build()
// rivedi ogni dettaglio prima che qualcosa si muova
presente(conferma: tx.summary)
// importo · tariffa · destinatario: ancora nulla di inviato
1 / 4

Viene derivata la chiave di firma

Una chiave figlio per input viene derivata tramite il percorso BIP-32.

// deriva la chiave figlio per questo input (BIP-32)
let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// esegue l'hash della preimmagine della transazione (doppio SHA-256)
lascia h = SHA256(SHA256(tx.preimage(i)))
// accedi all'interno diSecure Enclave (richiede Face ID)
lascia sig = prova SecureEnclave.sign(h, chiave: chiave,
curva:.secp256k1)
// solo i byte firmati lasciano il dispositivo
tx.attach(sig, input: i)
rete.broadcast(tx.serializzato)

Semplificato da Swift open source diAperture: i veri algoritmi, sul tuo dispositivo.

Leggi la fonte completa

Nota cosa manca: nessun server, nessun account, nessuna chiave che attraversa mai la rete. La chiave privata viene creata, archiviata e utilizzata interamente all'interno delSecure Enclave del tuo dispositivo.