Cara Ia Berfungsi —Aperture

Di bawah tudung

Kod sebenar.
Keselamatan sebenar.

Inilah yang berlaku pada peranti anda apabila anda membuat dompet, memulihkannya dan memindahkan dana — dikesan, langkah demi langkah, melalui kod sumber terbuka yang dijalankan pada iPhone anda.

1 / 5

128 bit rawak sebenar

Sistem CSPRNG menghasilkan entropi mentah pada peranti anda — sumber tunggal keseluruhan dompet anda.

// 128 bit entropi daripada sistem CSPRNG
var entropi = Data(kiraan: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropy)
// checksum = bit pertama SHA-256(entropi)
biarkan checksum = SHA256.hash(data: entropi).prefix(1)
biarkan bit = entropi + checksum
// memetakan setiap kumpulan 11-bit ke senarai perkataan BIP-39
biarkan mnemonik = bits.chunks(daripada: 11)
.peta { senarai perkataan[$0] } // 12 perkataan
// regangan kepada benih 512-bit (PBKDF2-HMAC-SHA512)
biarkan benih = PBKDF2.sha512(mnemonik.bergabung(" "),
garam: "mnemonik", pusingan: 2048)
// meterai dalamSecure Enclave — ia tidak pernah keluar
cuba Keychain.store(benih, akses:.thisDeviceOnly,
biometri:.faceID)
1 / 4

Anda menaip frasa anda

Ia dimasukkan secara tempatan dan tidak pernah dihantar ke mana-mana.

// baca frasa yang anda taip — tidak pernah dihantar
biarkan perkataan = frasa.huruf kecil().split(" ")
// setiap perkataan mesti wujud dalam senarai BIP-39
guard words.allSatisfy(wordlist.contains)
else { throw WalletError.unknownWord }
// mengira semula dan mengesahkan jumlah semak
biarkan (entropi, jumlah) = words.toEntropy()
jaga SHA256.hash(data: entropi).verify(jumlah)
else { throw WalletError.badChecksum }
// terbitan yang sama seperti penjanaan — luar talian sepenuhnya
biarkan benih = PBKDF2.sha512(words.joined(" "),
garam: "mnemonik", pusingan: 2048)
cuba Keychain.store(benih, akses:.thisDeviceOnly)
1 / 3

Syiling anda sendiri dipilih

Input datang daripada output anda yang tidak dibelanjakan — tiada pihak ketiga terlibat.

// pilih syiling daripada output anda sendiri yang tidak dibelanjakan
biarkan input = wallet.selectUTXOs(amaun + yuran)
// bina urus niaga sepenuhnya pada peranti
biarkan tx = TxBuilder(.bitcoin)
.tambah(input)
.hantar(jumlah, kepada: penerima)
.change(to: wallet.changeAddress).build()
// anda menyemak setiap butiran sebelum apa-apa bergerak
hadir(sahkan: tx.summary)
// jumlah · yuran · penerima — tiada apa yang dihantar lagi
1 / 4

Kunci tandatangan diperolehi

Kunci anak per-input diperoleh melalui laluan BIP-32.

// dapatkan kunci anak untuk input ini (BIP-32)
let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// cincang praimej transaksi (ganda SHA-256)
biarkan h = SHA256(SHA256(tx.preimage(i)))
// tandatangan di dalamSecure Enclave (memerlukan Face ID)
let sig = cuba SecureEnclave.sign(h, kunci: kunci,
lengkung:.secp256k1)
// hanya bait yang ditandatangani meninggalkan peranti
tx.attach(sig, input: i)
network.broadcast(tx.serialized)

Dipermudahkan daripada Swift sumber terbukaAperture — algoritma sebenar, pada peranti anda.

Baca sumber penuh

Perhatikan apa yang hilang: tiada pelayan, tiada akaun, tiada kunci yang pernah melintasi rangkaian. Kunci peribadi dicipta, disimpan dan digunakan sepenuhnya di dalamSecure Enclave peranti anda.