Как это работает — ZXAPERTURUREBRANDZX

Под капотом

Реальный код.
Настоящая безопасность.

Именно это происходит на вашем устройстве, когда вы создаете кошелек, восстанавливаете его и перемещаете средства — шаг за шагом отслеживается с помощью открытого исходного кода, который работает на вашем iPhone.

1 / 5

128 бит истинной случайности

Система CSPRNG производит необработанную энтропию на вашем устройстве — единый источник всего вашего кошелька.

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

Вы вводите свою фразу

Он вводится локально и никогда никуда не передается.

// читаем введенную вами фразу — никогда не передается
пусть слова = фраза.нижний регистр().split(" ")
// каждое слово должно существовать в списке BIP-39
защитные слова.allSatisfy(wordlist.contains)
еще { throw WalletError.unknownWord }
// пересчитываем и проверяем контрольную сумму
let (энтропия, сумма) = word.toEntropy()
охранник SHA256.hash(данные: энтропия).проверяет(сумма)
еще {бросить WalletError.badChecksum}
// тот же выв—д, что и генерация — полностью офлайн
пусть семя = PBKDF2.sha512(words.joined(" "),
соль: "мнемоническая", раундов: 2048)
попробуйте Keychain.store(seed, access:.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 = попробуйте SecureEnclave.sign(h, key: key,
кривая:.secp256k1)
// —олько подписанные байты покидают устройство
tx.attach(подпись, ввод: я)
network.broadcast(tx.serialized)

Упрощено из Swift с открытым исходным кодомAperture — настоящие алгоритмы на вашем устройстве.

Прочитать полный источник

Обратите внимание, чего не хватает: ни сервера, ни учетной записи, ни одного ключа, никогда не пересекающего сеть. Закрытый ключ создается, хранится и используется полностью внутриSecure Enclave вашего устройства.