Hoe het werkt —Aperture

Onder de motorkap

Echte code.
Echte veiligheid.

Dit is precies wat er op uw apparaat gebeurt als u een portemonnee aanmaakt, er een herstelt en geld overboekt – stap voor stap getraceerd via de open-sourcecode die op uw iPhone draait.

1 / 5

128 bits echte willekeur

Het systeem CSPRNG produceert ruwe entropie op uw apparaat – de enige bron van uw hele portemonnee.

// 128 bits entropie van het systeem CSPRNG
var entropie = Gegevens (aantal: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropie)
// checksum = eerste bits van SHA-256 (entropie)
laat controlesom = SHA256.hash(data: entropie).prefix(1)
laat bits = entropie + checksum
// wijs elke 11-bits groep toe aan de BIP-39-woordenlijst
laat geheugensteuntje = bits.chunks(van: 11)
.map { woordenlijst[$0] } // 12 woorden
// uitrekken naar een 512-bits zaadbestand (PBKDF2-HMAC-SHA512)
laat zaad = PBKDF2.sha512(ezelsbruggetje.joined(" "),
zout: "ezelsbruggetje", rondes: 2048)
// verzegel deSecure Enclave — hij gaat nooit meer weg
probeer Keychain.store (seed, toegang:.thisDeviceOnly,
biometrie:.faceID)
1 / 4

U typt uw zin

Het wordt lokaal ingevoerd en nooit ergens verzonden.

// lees de zin die u typt - nooit verzonden
laat woorden = zin.lowercased().split(" ")
// elk woord moet voorkomen in de BIP-39-lijst
bewaker woorden.allSatisfy(woordenlijst.bevat)
else {gooi WalletError.unknownWord }
// bereken en verifieer de controlesom opnieuw
let (entropie, som) = woorden.toEntropy()
bewaker SHA256.hash(gegevens: entropie).verifieert(som)
anders {gooi WalletError.badChecksum }
// dezelfde afleiding als generatie — volledig offline
laat zaad = PBKDF2.sha512(words.joined(" "),
zout: "ezelsbruggetje", rondes: 2048)
probeer Keychain.store (seed, toegang:.thisDeviceOnly)
1 / 3

Uw eigen munten worden geselecteerd

De input is afkomstig van uw niet-bestede output; er is geen derde partij bij betrokken.

// kies munten uit uw eigen ongebruikte output
let inputs = wallet.selectUTXOs(bedrag + vergoeding)
// bouw de transactie volledig op het apparaat
laat tx = TxBuilder(.bitcoin)
.add(invoer)
.send(bedrag, naar: ontvanger)
.change(naar: portemonnee.changeAddress).build()
// je bekijkt elk detail voordat er iets beweegt
aanwezig(bevestig: tx.samenvatting)
// bedrag · vergoeding · ontvanger — nog niets verzonden
1 / 4

De ondertekeningssleutel wordt afgeleid

Een onderliggende sleutel per invoer wordt afgeleid via het BIP-32-pad.

// leid de onderliggende sleutel voor deze invoer af (BIP-32)
laat sleutel = masterKey.derive("m/84'/0'/0'/0/\(i)")
// hash de transactievoorafbeelding (dubbele SHA-256)
laat h = SHA256(SHA256(tx.preimage(i)))
// teken in deSecure Enclave (heeft Face ID nodig)
let sig = probeer SecureEnclave.sign(h, sleutel: sleutel,
curve:.secp256k1)
// alleen ondertekende bytes verlaten het apparaat
tx.attach(sig, invoer: i)
netwerk.broadcast(tx.serialized)

Vereenvoudigd vanuit de open-source Swift vanAperture: de echte algoritmen, op uw apparaat.

Lees de volledige bron

Merk op wat er ontbreekt: geen server, geen account, geen sleutel die ooit het netwerk doorkruist. De privésleutel wordt volledig in deSecure Enclave van uw apparaat gemaakt, opgeslagen en gebruikt.