工作原理 —Aperture

在引擎盖下

真实的代码。
真正的安全。

这正是您创建钱包、恢复钱包和转移资金时设备上发生的情况 - 通过 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 内创建、存储和使用。