Cómo funciona —Aperture

Debajo del capó

Código real.
Verdadera seguridad.

Esto es exactamente lo que sucede en su dispositivo cuando crea una billetera, la restaura y mueve fondos, rastreados, paso a paso, a través del código fuente abierto que se ejecuta en su iPhone.

1 / 5

128 bits de verdadera aleatoriedad

El sistema CSPRNG produce entropía bruta en su dispositivo, la única fuente de toda su billetera.

// 128 bits de entropía del sistema CSPRNG
var entropía = Datos (recuento: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropía)
// suma de comprobación = primeros bits de SHA-256(entropía)
let suma de comprobación = SHA256.hash(datos: entropía).prefix(1)
let bits = entropía + suma de comprobación
// asigna cada grupo de 11 bits a la lista de palabras BIP-39
let mnemotécnico = bits.chunks(de: 11)
.map { lista de palabras[$0] } // 12 palabras
// extender a una semilla de 512 bits (PBKDF2-HMAC-SHA512)
dejar semilla = PBKDF2.sha512(mnemonic.joined(" "),
sal: "mnemónico", rondas: 2048)
// sella elSecure Enclave — nunca sale
pruebe Keychain.store(seed, acceda:.thisDeviceOnly,
biometría:.faceID)
1 / 4

Escribes tu frase

Se ingresa localmente y nunca se transmite a ninguna parte.

// lee la frase que escribes, nunca transmitida
let palabras = frase.minúsculas().split(" ")
// cada palabra debe existir en la lista BIP-39
guardar palabras.allSatisfy(lista de palabras.contiene)
else {lanzar WalletError.unknownWord}
// recalcular y verificar la suma de comprobación
let (entropía, suma) = palabras.toEntropy()
guard SHA256.hash (datos: entropía). verifica (suma)
else {tirar WalletError.badChecksum}
// misma derivación que generación – completamente fuera de línea
dejar semilla = PBKDF2.sha512(palabras.unidas(" "),
sal: "mnemónico", rondas: 2048)
pruebe Keychain.store (semilla, acceso:.thisDeviceOnly)
1 / 3

Se seleccionan tus propias monedas.

Los insumos provienen de sus productos no utilizados: no interviene ningún tercero.

// recoge monedas de tus propios productos no gastados
let inputs = wallet.selectUTXOs(monto + tarifa)
// construye la transacción completamente en el dispositivo
sea tx = TxBuilder(.bitcoin)
.add(entradas)
.enviar(monto, a: destinatario)
.cambiar(a: wallet.changeAddress).build()
// revisas cada detalle antes de que algo se mueva
presente (confirmar: tx.summary)
// monto · tarifa · destinatario — aún no se ha enviado nada
1 / 4

La clave de firma se deriva

Una clave secundaria por entrada se deriva a través de la ruta BIP-32.

// deriva la clave secundaria para esta entrada (BIP-32)
let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// hash de la preimagen de la transacción (doble SHA-256)
sea ​​h = SHA256(SHA256(tx.preimage(i)))
// firma dentro delSecure Enclave (necesita Face ID)
let sig = prueba SecureEnclave.sign(h, clave: clave,
curva:.secp256k1)
// solo los bytes firmados salen del dispositivo
tx.attach(sig, entrada: i)
red.broadcast(tx.serializado)

Simplificado a partir del Swift de código abierto deAperture: los algoritmos reales en su dispositivo.

Leer la fuente completa

Observe lo que falta: ningún servidor, ninguna cuenta, ninguna clave que cruce la red. La clave privada se crea, almacena y utiliza completamente dentro delSecure Enclave de su dispositivo.