Paano Ito Gumagana —Aperture

Sa ilalim ng talukbong

Tunay na code.
Tunay na kaligtasan.

Ganito mismo ang nangyayari sa iyong device kapag gumawa ka ng wallet, nag-restore ng isa, at naglipat ng mga pondo — sinusubaybayan, hakbang-hakbang, sa pamamagitan ng open-source code na tumatakbo sa iyong iPhone.

1 / 5

128 bits ng totoong randomness

Ang system na CSPRNG ay gumagawa ng raw entropy sa iyong device — ang nag-iisang pinagmulan ng iyong buong wallet.

// 128 bits ng entropy mula sa system CSPRNG
var entropy = Data(bilang: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropy)
// checksum = unang piraso ng SHA-256(entropy)
hayaan ang checksum = SHA256.hash(data: entropy).prefix(1)
let bits = entropy + checksum
// imapa ang bawat 11-bit na grupo sa BIP-39 wordlist
let mnemonic = bits.chunks(of: 11)
.map { wordlist[$0] } // 12 salita
// mag-abot sa isang 512-bit na binhi (PBKDF2-HMAC-SHA512)
let seed = PBKDF2.sha512(mnemonic.joined(""),
asin: "mnemonic", round: 2048)
// seal saSecure Enclave — hindi ito umaalis
subukan ang Keychain.store(seed, access:.thisDeviceOnly,
biometry:.faceID)
1 / 4

I-type mo ang iyong parirala

Ito ay ipinasok sa lokal at hindi kailanman ipinadala kahit saan.

// basahin ang pariralang tina-type mo — hindi kailanman ipinadala
let words = phrase.lowercased().split(" ")
// bawat salita ay dapat na nasa listahan ng BIP-39
bantayan ang mga salita.allSatisfy(wordlist.contains)
else { throw WalletError.unknownWord }
// recompute at i-verify ang checksum
let (entropy, sum) = words.toEntropy()
bantayan SHA256.hash(data: entropy).verify(sum)
else { throw WalletError.badChecksum }
// parehong derivation bilang henerasyon — ganap na offline
let seed = PBKDF2.sha512(words.joined(""),
asin: "mnemonic", round: 2048)
subukan ang Keychain.store(seed, access:.thisDeviceOnly)
1 / 3

Ang iyong sariling mga barya ay pinili

Ang mga input ay nagmumula sa iyong mga hindi nagamit na output — walang third party na kasangkot.

// pumili ng mga barya mula sa sarili mong mga hindi nagastos na output
let inputs = wallet.selectUTXOs(halaga + bayad)
// buuin ang transaksyon nang buo sa device
let tx = TxBuilder(.bitcoin)
.add(inputs)
.send(amount, to: recipient)
.change(to: wallet.changeAddress).build()
// susuriin mo ang bawat detalye bago gumalaw ang anumang bagay
kasalukuyan(kumpirmahin: tx.buod)
// halaga · bayad · tatanggap — wala pang naipadala
1 / 4

Ang signing key ay nakuha

Ang per-input child key ay nakukuha sa pamamagitan ng BIP-32 path.

// kunin ang child key para sa input na ito (BIP-32)
let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// hash ang preimage ng transaksyon (dobleng SHA-256)
hayaan h = SHA256(SHA256(tx.preimage(i)))
// sign sa loob ngSecure Enclave (kailangan ng Face ID)
let sig = subukan ang SecureEnclave.sign(h, key: key,
curve:.secp256k1)
// ang mga naka-sign na byte lang ang umalis sa device
tx.attach(sig, input: i)
network.broadcast(tx.serialized)

Pinasimple mula sa open-source na Swift ngAperture — ang tunay na mga algorithm, sa iyong device.

Basahin ang buong pinagmulan

Pansinin kung ano ang nawawala: walang server, walang account, walang susi na tumatawid sa network. Ang pribadong key ay ginawa, iniimbak, at ginagamit nang buo sa loob ngSecure Enclave ng iyong device.