Jak to działa —Aperture

Pod maską

Prawdziwy kod.
Prawdziwe bezpieczeństwo.

Dokładnie to samo dzieje się na Twoim urządzeniu, gdy tworzysz portfel, przywracasz go i przenosisz środki – możesz to prześledzić krok po kroku poprzez kod open source działający na Twoim iPhonie.

1 / 5

128 bitów prawdziwej losowości

System CSPRNG generuje surową entropię na Twoim urządzeniu — pojedyncze źródło całego Twojego portfela.

// 128 bitów entropii z układu CSPRNG
var entropia = dane (liczba: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropia)
// suma kontrolna = pierwsze bity SHA-256(entropia)
niech suma kontrolna = SHA256.hash(dane: entropia).prefix(1)
niech bity = entropia + suma kontrolna
// mapuj każdą 11-bitową grupę na listę słów BIP-39
niech mnemonic = bits.chunks(of: 11)
.map {wordlist[$0] } // 12 słów
// rozciągnij do 512-bitowego ziarna (PBKDF2-HMAC-SHA512)
niech ziarno = PBKDF2.sha512(mnemonic.joined(" "),
sól: „mnemonik”, rundy: 2048)
// zapieczętujSecure Enclave — nigdy nie opuszcza
spróbuj Keychain.store (nasiono, dostęp:.thisDeviceOnly,
biometria:.faceID)
1 / 4

Wpisujesz frazę

Jest wprowadzany lokalnie i nigdy nigdzie nie jest przesyłany.

// przeczytaj wpisaną frazę — nigdy nie została przesłana
niech słowa = fraza.lowercased().split(" ")
// każde słowo musi istnieć na liście BIP-39
strzeż słów.allSatisfy(lista słów.zawiera)
else {rzuć WalletError.unknownWord }
// ponownie oblicz i zweryfikuj sumę kontrolną
niech (entropia, suma) =words.toEntropy()
strażnik SHA256.hash(dane: entropia).weryfikuje(suma)
else {rzuć WalletError.badChecksum }
// to samo wyprowadzenie co w generacji — całkowicie offline
niech ziarno = PBKDF2.sha512(words.joined(" "),
sól: „mnemonik”, rundy: 2048)
wypróbuj Keychain.store (nasiono, dostęp:.thisDeviceOnly)
1 / 3

Wybrane zostaną Twoje własne monety

Wejścia pochodzą z niewydanych wyników — nie są zaangażowane żadne osoby trzecie.

// wybieraj monety z własnych niewydanych wyników
niech wejścia = portfel.selectUTXOs(kwota + opłata)
// zbuduj transakcję całkowicie na urządzeniu
niech tx = TxBuilder(.bitcoin)
.add(wejścia)
.send(kwota, do: odbiorca)
.change(na: portfel.changeAddress).build()
// przeglądasz każdy szczegół, zanim cokolwiek się poruszy
obecny (potwierdź: tx.podsumowanie)
// kwota · opłata · odbiorca — jeszcze nic nie zostało wysłane
1 / 4

Wyprowadza się klucz podpisujący

Klucz podrzędny dla każdego wejścia jest uzyskiwany za pośrednictwem ścieżki BIP-32.

// uzyskaj klucz podrzędny dla tego wejścia (BIP-32)
niech klucz = masterKey.derive("m/84'/0'/0'/0/\(i)")
// haszuj obraz wstępny transakcji (podwójne SHA-256)
niech h = SHA256(SHA256(tx.preimage(i)))
// zarejestruj się wSecure Enclave (potrzebny Face ID)
niech sig = spróbuj SecureEnclave.sign(h, klucz: klucz,
krzywa:.secp256k1)
// tylko podpisane bajty opuszczają urządzenie
tx.attach(sig, wejście: i)
sieć.broadcast(tx.serialized)

Uproszczony na podstawie otwartego oprogramowania SwiftAperture — prawdziwych algorytmów na Twoim urządzeniu.

Przeczytaj pełne źródło

Zauważ, czego brakuje: żadnego serwera, żadnego konta, żadnego klucza, który kiedykolwiek przechodził przez sieć. Klucz prywatny jest tworzony, przechowywany i używany w całości wSecure Enclave Twojego urządzenia.