在引擎蓋下
真實的代碼。
真正的安全。
這正是您創建錢包、恢復錢包和轉移資金時設備上發生的情況 - 透過 iPhone 上運行的開源程式碼逐步追蹤。
1 / 5
128 位元真實隨機性
CSPRNG 系統在您的裝置上產生原始熵——整個錢包的單一來源。
// 來自系統 CSPRNG 的 128 位元熵
var 熵 = 數據(計數:16)
SecRandomCopyBytes(kSecRandomDefault, 16, &熵)
// 校驗和 = SHA-256 的前幾位(熵)
讓 checksum = SHA256.hash(data: entropy).prefix(1)
設位 = 熵 + 校驗和
// 將每個 11 位元組對應到 BIP-39 字表
讓助記符=bits.chunks(of: 11)
.map { wordlist[$0] } // 12 個字
// 拉伸到 512 位元種子 (PBKDF2-HMAC-SHA512)
讓種子 = PBKDF2.sha512(mnemonic.joined(" "),
鹽:“助記符”,輪次:2048)
// 封在Secure Enclave 中 — 它永遠不會離開
嘗試 Keychain.store(種子, 訪問:.thisDeviceOnly,
生物辨識:.faceID)
1 / 4
你输入你的短语
它在本地輸入並且不會傳輸到任何地方。
// 讀取您輸入的短語—從未傳輸
設字=phrase.lowercased().split(" ")
// 每個單字都必須存在於 BIP-39 清單中
保護詞.allSatisfy(wordlist.contains)
否則 { 拋出 WalletError.unknownWord }
// 重新計算並驗證校驗和
讓(熵,總和)=words.toEntropy()
守衛 SHA256.hash(資料:熵).verizes(sum)
else { 拋出 WalletError.badChecksum }
// 與產生相同的推導-完全離線
讓種子 = PBKDF2.sha512(words.joined(" "),
鹽:“助記符”,輪次:2048)
嘗試 Keychain.store(種子, 訪問:.thisDeviceOnly)
1 / 3
選擇您自己的硬幣
輸入來自您未使用的輸出—不涉及第三方。
// 從你自己未使用的輸出中挑選硬幣
讓輸入= wallet.selectUTXOs(金額+費用)
// 完全在裝置上建立交易
讓 tx = TxBuilder(.bitcoin)
.add(輸入)
.send(金額,收件人:收件人)
.change(to: wallet.changeAddress).build()
// 在任何事情發生之前你要檢查每一個細節
存在(確認:tx.summary)
// 金額 · 費用 · 收件者 — 尚未傳送任何內容
1 / 4
簽署金鑰已派生
每個輸入的子金鑰是透過 BIP-32 路徑派生的。
// 衍生此輸入的子金鑰 (BIP-32)
讓 key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// 對交易原像進行哈希處理(雙 SHA-256)
令 h = SHA256(SHA256(tx.preimage(i)))
// 在Secure Enclave 內簽署(需要 Face ID)
讓 sig = 試試 SecureEnclave.sign(h, key: key,
曲線:.secp256k1)
// 只有帶符號的位元組離開設備
tx.attach(sig, 輸入: i)
網路.廣播(tx.序列化)
從Aperture 的開源 Swift 進行簡化 - 真正的演算法,在您的裝置上。
閱讀完整原始碼請注意缺少什麼:沒有伺服器,沒有帳戶,沒有穿過網路的密鑰。私鑰完全在您裝置的Secure Enclave 內建立、儲存和使用。