Pod pokrovom
Prava koda.
Prava varnost.
Natančno to se zgodi v vaši napravi, ko ustvarite denarnico, jo obnovite in premaknete sredstva – korak za korakom sledite skozi odprtokodno kodo, ki se izvaja na vašem iPhoneu.
1 / 5
128 bitov prave naključnosti
Sistem CSPRNG proizvaja surovo entropijo v vaši napravi — edinem viru vaše celotne denarnice.
// 128 bitov entropije iz sistema CSPRNG
spremenljiva entropija = podatki (štetje: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropija)
// kontrolna vsota = prvi biti SHA-256 (entropija)
naj kontrolna vsota = SHA256.hash(podatki: entropija).prefix(1)
pusti biti = entropija + kontrolna vsota
// preslikava vsake 11-bitne skupine v seznam besed BIP-39
let mnemonic = bits.chunks(od: 11)
.map { seznam besed[$0] } // 12 besed
// raztegne na 512-bitno seme (PBKDF2-HMAC-SHA512)
naj seme = PBKDF2.sha512(mnemonic.joined(" "),
sol: "mnemonika", krogi: 2048)
// pečat vSecure Enclave — nikoli ne zapusti
poskusite Keychain.store(seed, dostop:.thisDeviceOnly,
biometrija:.faceID)
1 / 4
Vtipkate svojo frazo
Vnese se lokalno in se nikoli ne prenaša nikamor.
// preberi besedno zvezo, ki jo vtipkaš — nikoli prenesena
let words = phrase.lowercased().split(" ")
// vsaka beseda mora obstajati na seznamu BIP-39
guard words.allSatisfy(wordlist.contains)
else { throw WalletError.unknownWord }
// ponovno izračunaj in preveri kontrolno vsoto
naj (entropija, vsota) = words.toEntropy()
guard SHA256.hash(podatki: entropija).verificira(vsota)
else { throw WalletError.badChecksum }
// enaka izpeljava kot generacija — popolnoma brez povezave
naj seme = PBKDF2.sha512(words.joined(" "),
sol: "mnemonika", krogi: 2048)
poskusite Keychain.store(seed, dostop:.thisDeviceOnly)
1 / 3
Izbrani so vaši lastni kovanci
Vložki prihajajo iz vaših neporabljenih izhodov - tretja oseba ni vpletena.
// izbiranje kovancev iz lastnih neporabljenih rezultatov
naj vložki = wallet.selectUTXOs(znesek + provizija)
// zgradite transakcijo v celoti na napravi
naj tx = TxBuilder(.bitcoin)
.add(vnosi)
.send(znesek, do: prejemnik)
.change(to: wallet.changeAddress).build()
// pregledate vsako podrobnost, preden se karkoli premakne
prisoten (potrdi: tx.summary)
// znesek · provizija · prejemnik — še nič poslano
1 / 4
Podpisni ključ je izpeljan
Podrejeni ključ za vsak vnos je izpeljan po poti BIP-32.
// izpelji podrejeni ključ za ta vnos (BIP-32)
pusti ključ = masterKey.derive("m/84'/0'/0'/0/\(i)")
// zgoščevanje predslike transakcije (dvojni SHA-256)
naj h = SHA256(SHA256(tx.preimage(i)))
// podpis znotrajSecure Enclave (potrebuje Face ID)
pusti sig = poskusi SecureEnclave.sign(h, ključ: ključ,
krivulja:.secp256k1)
// samo podpisani bajti zapustijo napravo
tx.attach(sig, vnos: i)
network.broadcast(tx.serialized)
Poenostavljeno iz odprtokodnega SwiftaAperture — pravi algoritmi v vaši napravi.
Preberite celoten virOpazite, kaj manjka: noben strežnik, noben račun, noben ključ ne prečka omrežja. Zasebni ključ je ustvarjen, shranjen in v celoti uporabljen znotrajSecure Enclave vaše naprave.