Comment ça marche —Aperture

Sous le capot

Du vrai code.
Une vraie sécurité.

C’est exactement ce qui se passe sur votre appareil lorsque vous créez un portefeuille, en restaurez un et déplacez des fonds – en suivant étape par étape le code open source qui s’exécute sur votre iPhone.

1 / 5

128 bits de vrai hasard

Le système CSPRNG produit de l'entropie brute sur votre appareil – la source unique de l'ensemble de votre portefeuille.

// 128 bits d'entropie du système CSPRNG
var entropie = Données (nombre: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropie)
// somme de contrôle = premiers bits de SHA-256 (entropie)
soit la somme de contrôle = SHA256.hash (données: entropie).prefix (1)
laissez bits = entropie + somme de contrôle
// mappe chaque groupe de 11 bits à la liste de mots BIP-39
soit mnémonique = bits.chunks (sur: 11)
.map { wordlist[$0] } // 12 mots
// s'étend jusqu'à une graine de 512 bits (PBKDF2-HMAC-SHA512)
laissez seed = PBKDF2.sha512(mnemonic.joined(" "),
sel: "mnémonique", tours: 2048)
// scelle leSecure Enclave — il ne part jamais
essayez Keychain.store (seed, accès:.thisDeviceOnly,
biométrie:.faceID)
1 / 4

Vous tapez votre phrase

Il est saisi localement et n'est jamais transmis nulle part.

// lit la phrase que vous tapez - jamais transmise
laissez les mots = phrase.lowercased().split(" ")
// chaque mot doit exister dans la liste BIP-39
garde mots.allSatisfy(wordlist.contains)
sinon {lancer WalletError.unknownWord}
// recalcule et vérifie la somme de contrôle
let (entropie, somme) = mots.toEntropy()
guard SHA256.hash (données: entropie). vérifie (somme)
sinon {lancer WalletError.badChecksum}
// même dérivation que la génération — entièrement hors ligne
laissez seed = PBKDF2.sha512(words.joined(" "),
sel: "mnémonique", tours: 2048)
essayez Keychain.store (seed, accès:.thisDeviceOnly)
1 / 3

Vos propres pièces sont sélectionnées

Les entrées proviennent de vos sorties non dépensées – aucun tiers n’est impliqué.

// sélectionne les pièces de vos propres sorties non dépensées
let inputs = wallet.selectUTXOs (montant + frais)
// construit la transaction entièrement sur l'appareil
laissez tx = TxBuilder (.bitcoin)
.ajouter (entrées)
.send(montant, à: destinataire)
.change(vers: wallet.changeAddress).build()
// vous examinez chaque détail avant que quoi que ce soit ne bouge
présent (confirmer: tx.summary)
// montant · frais · destinataire — rien n'a encore été envoyé
1 / 4

La clé de signature est dérivée

Une clé enfant par entrée est dérivée via le chemin BIP-32.

// dérive la clé enfant pour cette entrée (BIP-32)
let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// hache la préimage de la transaction (double SHA-256)
soit h = SHA256(SHA256(tx.preimage(i)))
// signez à l'intérieur duSecure Enclave (nécessite Face ID)
let sig = essayez SecureEnclave.sign(h, clé: clé,
courbe:.secp256k1)
// seuls les octets signés quittent le périphérique
tx.attach(sig, entrée: i)
réseau.broadcast (tx.sérialisé)

Simplifié à partir de Swift open source deAperture — les vrais algorithmes, sur votre appareil.

Lire la source complète

Remarquez ce qui manque: aucun serveur, aucun compte, aucune clé ne traversant le réseau. La clé privée est créée, stockée et utilisée entièrement dans leSecure Enclave de votre appareil.