Kapoti all
Päris kood.
Tõeline ohutus.
Täpselt nii juhtub teie seadmes, kui loote rahakoti, taastate selle ja teisaldate raha – seda jälgitakse samm-sammult teie iPhone'is töötava avatud lähtekoodiga.
1 / 5
128 bitti tõelist juhuslikkust
Süsteem CSPRNG loob teie seadmes toorentroopia – kogu teie rahakoti ainsa allika.
// 128 bitti entroopiat süsteemist CSPRNG
var entroopia = andmed (loendus: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entroopia)
// kontrollsumma = SHA-256 (entroopia) esimesed bitid
las kontrollsumma = SHA256.hash(andmed: entroopia).prefix(1)
olgu bitid = entroopia + kontrollsumma
// vastendada iga 11-bitine rühm BIP-39 sõnaloendisse
olgu mnemoonika = bits.chunks(of: 11)
.map { wordlist[$0] } // 12 sõna
// venitada 512-bitise seemneni (PBKDF2-HMAC-SHA512)
let seed = PBKDF2.sha512(mnemonic.joined(" "),
sool: "mnemooniline", ringid: 2048)
// pitsatSecure Enclave-is — see ei lahku kunagi
proovi Keychain.store(seed, juurdepääs:.thisDeviceOnly,
biomeetria:.faceID)
1 / 4
Sisestate oma fraasi
See sisestatakse kohapeal ja seda ei edastata kunagi kuhugi.
// lugege sisestatud fraasi – pole kunagi edastatud
las sõnad = fraas.madalatäheline().split(" ")
// iga sõna peab olema BIP-39 loendis
kaitsesõnad.allSatisfy(sõnaloend.sisaldab)
else { viska WalletError.unknownWord }
// arvutage kontrollsumma ümber ja kontrollige seda
las (entroopia, summa) = sõnad.entroopia()
valvur SHA256.hash(andmed: entropy).verifies(sum)
else { viska WalletError.badChecksum }
// sama tuletus nagu genereerimine – täiesti võrguühenduseta
let seed = PBKDF2.sha512(words.joined(" "),
sool: "mnemooniline", ringid: 2048)
proovige Keychain.store(seemne, juurdepääs:.thisDeviceOnly)
1 / 3
Teie enda mündid on valitud
Sisendid pärinevad teie kasutamata väljunditest – ükski kolmas osapool ei ole kaasatud.
// vali oma kulutamata väljundi hulgast münte
let inputs = wallet.selectUTXOs(summa + tasu)
// ehitage tehing täielikult seadmesse
olgu tx = TxBuilder(.bitcoin)
.add(sisendid)
.send(summa, to: adressaat)
.change(to: wallet.changeAddress).build()
// vaatad iga detaili üle enne kui midagi liigub
present(kinnita: tx.summary)
// summa · tasu · saaja — pole veel saadetud
1 / 4
Allkirjavõti tuletatakse
Sisendpõhine alamvõti tuletatakse BIP-32 tee kaudu.
// tuletage selle sisendi lapsvõti (BIP-32)
let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// tehingu eelpildi räsi (topelt SHA-256)
olgu h = SHA256(SHA256(tx.preimage(i)))
//Secure Enclave-i sees märk (vajab näo ID-d)
let sig = proovige SecureEnclave.sign(h, võti: võti,
kõver:.secp256k1)
// seadmest lahkuvad ainult allkirjastatud baidid
tx.attach(sig, sisend: i)
network.broadcast(tx.serialized)
LihtsustatudAperture-i avatud lähtekoodiga Swiftist – tõelistest algoritmidest teie seadmes.
Lugege täielikku allikatPange tähele, mis on puudu: serverit, kontot ega võtit pole kunagi võrku ületav. Privaatvõti luuakse, salvestatakse ja kasutatakse täielikult teie seadmeSecure Enclave-is.