Cara Kerjanya —Aperture

Di bawah tenda

Kode sebenarnya.
Keamanan nyata.

Inilah yang terjadi pada perangkat Anda saat Anda membuat dompet, memulihkan dompet, dan memindahkan dana — ditelusuri, langkah demi langkah, melalui kode sumber terbuka yang berjalan di iPhone Anda.

1 / 5

128 bit keacakan yang sebenarnya

Sistem CSPRNG menghasilkan entropi mentah pada perangkat Anda — satu-satunya sumber dari seluruh dompet Anda.

// 128 bit entropi dari sistem CSPRNG
var entropi = Data(hitungan: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropi)
// checksum = bit pertama SHA-256(entropi)
biarkan checksum = SHA256.hash(data: entropi).prefix(1)
biarkan bit = entropi + checksum
// memetakan setiap grup 11-bit ke daftar kata BIP-39
biarkan mnemonik = bits.chunks(dari: 11)
.map { daftar kata[$0] } // 12 kata
// meregang ke benih 512-bit (PBKDF2-HMAC-SHA512)
biarkan seed = PBKDF2.sha512(mnemonic.joined(" "),
garam: "mnemonik", putaran: 2048)
// segel diSecure Enclave — tidak pernah keluar
coba Keychain.store(seed, akses:.thisDeviceOnly,
biometri:.faceID)
1 / 4

Anda mengetik frasa Anda

Itu dimasukkan secara lokal dan tidak pernah ditularkan ke mana pun.

// membaca frasa yang Anda ketik — tidak pernah dikirimkan
biarkan kata = frase.huruf kecil().split(" ")
// setiap kata harus ada di daftar BIP-39
jaga kata.allSatisfy(daftar kata.berisi)
else { melempar WalletError.unknownWord }
// menghitung ulang dan memverifikasi checksum
biarkan (entropi, jumlah) = kata-kata.toEntropy()
penjaga SHA256.hash(data: entropi).verifikasi(jumlah)
lain { melempar WalletError.badChecksum }
// derivasi yang sama dengan pembuatan — sepenuhnya offline
biarkan benih = PBKDF2.sha512(kata.bergabung(" "),
garam: "mnemonik", putaran: 2048)
coba Keychain.store(seed, akses:.thisDeviceOnly)
1 / 3

Koin Anda sendiri dipilih

Masukan berasal dari keluaran Anda yang belum terpakai — tidak ada pihak ketiga yang terlibat.

// ambil koin dari hasil keluaranmu yang belum terpakai
biarkan input = wallet.selectUTXOs(jumlah + biaya)
// membangun transaksi seluruhnya di perangkat
misalkan tx = TxBuilder(.bitcoin)
.add(masukan)
.send(jumlah, ke: penerima)
.change(ke: wallet.changeAddress).build()
// Anda meninjau setiap detail sebelum ada yang bergerak
hadir(konfirmasi: tx.summary)
// jumlah · biaya · penerima — belum ada yang terkirim
1 / 4

Kunci penandatanganan diturunkan

Kunci anak per input diperoleh melalui jalur BIP-32.

// mendapatkan kunci anak untuk masukan ini (BIP-32)
biarkan kunci = masterKey.derive("m/84'/0'/0'/0/\(i)")
// hash gambar awal transaksi (SHA-256 ganda)
misalkan h = SHA256(SHA256(tx.preimage(i)))
// masuk ke dalamSecure Enclave (membutuhkan ID Wajah)
biarkan tanda = coba SecureEnclave.sign(h, kunci: kunci,
kurva:.secp256k1)
// hanya byte bertanda tangan yang keluar dari perangkat
tx.attach(sig, masukan: i)
jaringan.broadcast(tx.serialized)

Disederhanakan dari Swift sumber terbukaAperture — algoritme sebenarnya, di perangkat Anda.

Baca sumber selengkapnya

Perhatikan apa yang hilang: tidak ada server, tidak ada akun, tidak ada kunci yang melintasi jaringan. Kunci pribadi dibuat, disimpan, dan digunakan seluruhnya di dalamSecure Enclave perangkat Anda.