Kuinka se toimiiAperture

Konepellin alla

Oikea koodi.
Todellinen turvallisuus.

Juuri näin tapahtuu laitteessasi, kun luot lompakon, palautat sellaisen ja siirrät varoja – jäljitetään vaihe vaiheelta iPhonessasi käytettävän avoimen lähdekoodin kautta.

1 / 5

128 bittiä todellista satunnaisuutta

CSPRNG-järjestelmä tuottaa laitteellesi raakaentropian – koko lompakkosi yhden lähteen.

// 128 bittiä entropiaa järjestelmästä CSPRNG
var entropy = Data(luku: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropy)
// tarkistussumma = SHA-256:n (entropia) ensimmäiset bitit
anna tarkistussumma = SHA256.hash(data: entropy).prefix(1)
anna bitit = entropia + tarkistussumma
// yhdistä jokainen 11-bittinen ryhmä BIP-39-sanalistaan
anna muistomerkki = bits.chunks(of: 11)
.map { sanalista[$0] } // 12 sanaa
// venytä 512-bittiseksi siemeneksi (PBKDF2-HMAC-SHA512)
anna siemen = PBKDF2.sha512(mnemonic.joined(" "),
suola: "muistomerkki", kierrokset: 2048)
// sinettiSecure Enclave:ssä – se ei koskaan lähde
kokeile Keychain.store(seed, access:.thisDeviceOnly,
biometria:.faceID)
1 / 4

Kirjoitat lauseesi

Se syötetään paikallisesti, eikä sitä koskaan lähetetä minnekään.

// lue kirjoittamasi lause – ei koskaan lähetetty
anna sanat = lause.pienet().split(" ")
// jokaisen sanan on oltava BIP-39-luettelossa
vartiosanat.allSatisfy(sanalista.sisältää)
else { heittää WalletError.unknownWord }
// laske ja tarkista tarkistussumma uudelleen
anna (entropia, summa) = sanat.entropia()
vartija SHA256.hash(data: entropy).verifies(sum)
else { heittää WalletError.badChecksum }
// sama johdannainen kuin sukupolvi – täysin offline-tilassa
anna siemen = PBKDF2.sha512(words.joined(" "),
suola: "muistomerkki", kierrokset: 2048)
kokeile Keychain.store(seed, access:.thisDeviceOnly)
1 / 3

Omat kolikot valitaan

Tulokset tulevat käyttämättömistä tuotoksistasi – mikään kolmas osapuoli ei ole mukana.

// poimi kolikot omista käyttämättömistä tuloksistasi
anna tulot = lompakko.selectUTXOs(summa + maksu)
// rakentaa tapahtuma kokonaan laitteelle
anna tx = TxBuilder(.bitcoin)
.add(tulot)
.send(summa, vastaanottaja: vastaanottaja)
.change(to: wallet.changeAddress).build()
// tarkistat jokaisen yksityiskohdan ennen kuin mikään liikkuu
esittää (vahvista: tx.summary)
// summa · maksu · vastaanottaja — ei ole vielä lähetetty
1 / 4

Allekirjoitusavain johdetaan

Syötekohtainen lapsiavain johdetaan BIP-32-polun kautta.

// johtaa tämän syötteen lapsiavain (BIP-32)
let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// tiivistää tapahtuman esikuva (double SHA-256)
olkoon h = SHA256(SHA256(tx.preimage(i)))
// kirjauduSecure Enclave:n sisään (vaatii kasvotunnuksen)
anna sig = kokeile SecureEnclave.sign(h, avain: avain,
käyrä:.secp256k1)
// vain allekirjoitetut tavut lähtevät laitteesta
tx.attach(sig, input: i)
network.broadcast(tx.serialized)

YksinkertaistettuAperture:n avoimen lähdekoodin Swiftistä – laitteesi todellisista algoritmeista.

Lue koko lähde

Huomaa, mitä puuttuu: ei palvelinta, ei tiliä, ei avainta koskaan ylittämässä verkkoa. Yksityinen avain luodaan, tallennetaan ja sitä käytetään kokonaan laitteesiSecure Enclave:ssä.