Як це працює —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(з: 11)
.map { список слів [$0] } // 12 слів
// розтягуємо до 512-бітного початкового числа (PBKDF2-HMAC-SHA512)
let seed = 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 }
// перерахувати та перевірити контрольну суму
let (ентропія, сума) = words.toEntropy()
guard SHA256.hash(дані: ентропія).verifies(sum)
else { throw WalletError.badChecksum }
// те саме похідне, що й генерація — повністю офлайн
let seed = PBKDF2.sha512(words.joined(" "),
сіль: "мнемоніка", раундів: 2048)
спробуйте Keychain.store(seed, доступ:.thisDeviceOnly)
1 / 3

Вибираються власні монети

Вхідні дані надходять із ваших невитрачених виходів — жодна третя сторона не залучена.

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

Ключ підпису отримано

Дочірній ключ для кожного введення отримується через шлях BIP-32.

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

Спрощено на основі відкритого Swift відAperture — справжні алгоритми на вашому пристрої.

Прочитайте повне джерело

Зверніть увагу, чого не вистачає: ні сервера, ні облікового запису, ні ключа, який ніколи не перетинає мережу. Приватний ключ створюється, зберігається та використовується повністю вSecure Enclave вашого пристрою.