Как работи —Aperture

Под капака

Реален код.
Истинска безопасност.

Точно това се случва на вашето устройство, когато създавате портфейл, възстановявате такъв и премествате средства – проследявани стъпка по стъпка чрез кода с отворен код, който работи на вашия iPhone.

1 / 5

128 бита истинска произволност

Системата CSPRNG произвежда сурова ентропия на вашето устройство - единственият източник на целия ви п—ртфейл.

// 128 бита ентропия от системата CSPRNG
променлива ентропия = Данни (брой: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &ентропия)
// контролна сума = първите битове на SHA-256(ентропия)
нека контролна сума = SHA256.hash(данни: ентропия).prefix(1)
нека битове = ентропия + контролна сума
// съпоставяне на всяка 11-битова група към списъка с думи BIP-39
let mnemonic = bits.chunks(of: 11)
.map { wordlist[$0] } // 12 думи
// разтягане до 512-битово начало (PBKDF2-HMAC-SHA512)
нека семе = PBKDF2.sha512(mnemonic.joined(" "),
сол: "мнемоника", кръгове: 2048)
// запечатване вSecure Enclave — той никога не напуска
опитайте Keychain.store(seed, достъп:.thisDeviceOnly,
биометрия:.faceID)
1 / 4

Вие въвеждате фразата си

Въвежда се локално и никога не се предава никъде.

// прочетете въведената от вас фраза — никога не се предава
let words = phrase.lowercased().split(" ")
// всяка дума трябва да съществува в списъка BIP-39
guard words.allSatisfy(wordlist.contains)
else { throw WalletError.unknownWord }
// преизчисляване и проверка на контролната сума
нека (ентропия, сума) = words.toEntropy()
guard SHA256.hash(данни: ентропия).проверява(сума)
else { throw WalletError.badChecksum }
// същата деривация като генерирането — напълно офлайн
нека семе = PBKDF2.sha512(words.joined(" "),
сол: "мнемоника", кръгове: 2048)
опитайте Keychain.store(seed, достъп:.thisDeviceOnly)
1 / 3

Избират се вашите собствени монети

Входовете идват от вашите неизразходвани изходи — не участва трета страна.

// изберете монети от вашите собствени неизразходвани изходи
нека входове = wallet.selectUTXOs(сума + такса)
// изграждане на транзакцията изцяло на устройство
нека tx = TxBuilder(.bitcoin)
.add(входове)
.send(сума, до: полу—ател)
.change(to: wallet.changeAddress).build()
// преглеждате всеки детайл, преди нещо да се движи
присъства (потвърдете: tx.summary)
// сума · такса · получател — все още нищо не е изпратено
1 / 4

Извлича се ключът за подписване

Дъщерен ключ за всеки вход се извлича чрез пътя BIP-32.

// извлечете дъщерния ключ за този вход (BIP-32)
нека ключ = masterKey.derive("m/84'/0'/0'/0/\(i)")
// хеширане на прообраза на транзакцията (двоен SHA-256)
нека h = SHA256(SHA256(tx.preimage(i)))
// подпишете вътре вSecure Enclave (необходим е Face ID)
нека sig = опитайте SecureEnclave.sign(h, ключ: ключ,
крива:.secp256k1)
// само подписани байтове напускат устройството
tx.attach(sig, вход: i)
network.broadcast(tx.serialized)

Опростено от Swift с отворен код наAperture — истинските алгоритми на вашето устройство.

Прочетете пълния източник

Забележете какво липсва: нито сървър, нито акаунт, нито ключ, който да преминава през мрежата. Частният ключ се създава, съхранява и използва изцяло вSecure Enclave на вашето устройство.