Com funciona —Aperture

Sota el capó

Codi real.
Seguretat real.

Això és exactament el que succeeix al vostre dispositiu quan creeu una cartera, en restaureu una i moveu fons, rastrejada, pas a pas, a través del codi de codi obert que s'executa al vostre iPhone.

1 / 5

128 bits de veritable aleatorietat

El sistema CSPRNG produeix entropia bruta al vostre dispositiu, l'única font de tota la vostra cartera.

// 128 bits d'entropia del sistema CSPRNG
var entropia = Dades (nombre: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropia)
// suma de comprovació = primers bits de SHA-256 (entropia)
deixa comprovació = SHA256.hash (dades: entropia).prefix (1)
Let bits = entropia + suma de control
// mapeja cada grup d'11 bits a la llista de paraules BIP-39
deixar mnemotècnic = bits.chunks (de: 11)
.map { llista de paraules[$0] } // 12 paraules
// estirar a una llavor de 512 bits (PBKDF2-HMAC-SHA512)
deixa llavor = PBKDF2.sha512(mnemonic.joined(" "),
sal: "mnemotècnica", rondes: 2048)
// segell a laSecure Enclave — no surt mai
prova Keychain.store (llavor, accés:.thisDeviceOnly,
biometria:.faceID)
1 / 4

Escriviu la vostra frase

S'introdueix localment i mai es transmet enlloc.

// llegiu la frase que escriviu, mai transmesa
deixar paraules = phrase.lowercaseed().split(" ")
// cada paraula ha d'existir a la llista BIP-39
guarda les paraules.allSatisfy(lista de paraules.conté)
else { llança WalletError.unknownWord }
// torneu a calcular i verificar la suma de comprovació
deixar (entropia, suma) = paraules.toEntropia()
guarda SHA256.hash(dades: entropia).verifica (suma)
else { llança WalletError.badChecksum }
// mateixa derivació que la generació: completament fora de línia
deixa llavor = PBKDF2.sha512(words.joined(" "),
sal: "mnemotècnica", rondes: 2048)
prova Keychain.store (llavor, accés:.thisDeviceOnly)
1 / 3

Les teves pròpies monedes estan seleccionades

Les entrades provenen de les vostres sortides no gastades; no hi ha cap tercer implicat.

// escolliu monedes de les vostres pròpies sortides no gastades
let inputs = wallet.selectUTXOs (import + tarifa)
// crea la transacció completament al dispositiu
let tx = TxBuilder(.bitcoin)
.add(entrades)
.send(import, a: destinatari)
.change(a: wallet.changeAddress).build()
// reviseu tots els detalls abans que res es mogui
present (confirma: tx.summary)
// import · quota · destinatari — encara no s'ha enviat res
1 / 4

La clau de signatura es deriva

Una clau secundària per entrada es deriva a través del camí BIP-32.

// deriva la clau secundària per a aquesta entrada (BIP-32)
let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// hash la preimatge de la transacció (doble SHA-256)
deixem h = SHA256(SHA256(tx.preimage(i)))
// Signa dins delSecure Enclave (necessita Face ID)
deixar sig = provar SecureEnclave.sign(h, clau: clau,
corba:.secp256k1)
// només els bytes signats surten del dispositiu
tx.attach(sig, entrada: i)
network.broadcast(tx.serialized)

Simplificat a partir del Swift de codi obert deAperture: els algorismes reals, al vostre dispositiu.

Llegeix la font completa

Observeu el que falta: cap servidor, cap compte, cap clau que mai creua la xarxa. La clau privada es crea, s'emmagatzema i s'utilitza completament dins delSecure Enclave del vostre dispositiu.