ภายใต้ประทุน
รหัสจริง.
ปลอดภัยอย่างแท้จริง
นี่คือสิ่งที่เกิดขึ้นบนอุปกรณ์ของคุณเมื่อคุณสร้างกระเป๋าเงิน กู้คืนกระเป๋าเงิน และโอนเงิน — ติดตามทีละขั้นตอนผ่านโค้ดโอเพ่นซอร์สที่ทำงานบน iPhone ของคุณ
1 / 5
128 บิตของการสุ่มที่แท้จริง
ระบบ CSPRNG สร้างเอนโทรปีดิบบนอุปกรณ์ของคุณ ซึ่งเป็นแหล่งเดียวของกระเป๋าเงินทั้งหมดของคุณ
// เอนโทรปี 128 บิตจากระบบ CSPRNG
var entropy = ข้อมูล (จำนวน: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &เอนโทรปี)
// checksum = บิตแรกของ SHA-256 (เอนโทรปี)
ให้ checksum = SHA256.hash(data: entropy).prefix(1)
ให้บิต = เอนโทรปี + เช็คซัม
// แมปแต่ละกลุ่ม 11 บิตกับรายการคำศัพท์ BIP-39
ให้ช่วยในการจำ = bits.chunks (จาก: 11)
.map { รายการคำศัพท์[$0] } // 12 คำ
// ขยายเป็นเมล็ด 512 บิต (PBKDF2-HMAC-SHA512)
ให้ seed = PBKDF2.sha512(mnemonic.joined(" "),
เกลือ: "ช่วยจำ" รอบ: 2048)
// ปิดผนึกSecure Enclave — มันไม่เคยจากไป
ลอง Keychain.store (seed, เข้าถึง:.thisDeviceOnly,
ไบโอเมตริกซ์:.faceID)
1 / 4
คุณพิมพ์วลีของคุณ
มีการป้อนเข้ามาในพื้นที่และไม่เคยส่งไปที่ใดเลย
// อ่านวลีที่คุณพิมพ์ — ไม่เคยส่ง
ให้คำ =วลี.ตัวพิมพ์เล็ก().split(" ")
// ทุกคำต้องมีอยู่ในรายการ BIP-39
ยาม word.allSatisfy (wordlist.contains)
อื่น { โยน WalletError.unknownWord }
// คำนวณใหม่และตรวจสอบเช็คซัม
ให้ (เอนโทรปี, ผลรวม) = word.toEntropy()
ยาม SHA256.hash (ข้อมูล: เอนโทรปี) ตรวจสอบ (ผลรวม)
อื่น { โยน WalletError.badChecksum }
// มาจากรุ่นเดียวกัน — ออฟไลน์โดยสมบูรณ์
ให้ seed = PBKDF2.sha512(words.joined(" "),
เกลือ: "ช่วยจำ" รอบ: 2048)
ลอง Keychain.store (seed, เข้าถึง:.thisDeviceOnly)
1 / 3
เลือกเหรียญของคุณเองแล้ว
อินพุตมาจากเอาต์พุตที่ยังไม่ได้ใช้ของคุณ — ไม่มีบุคคลที่สามเข้ามาเกี่ยวข้อง
// เลือกเหรียญจากเอาต์พุตที่ยังไม่ได้ใช้ของคุณเอง
ให้อินพุต = wallet.selectUTXOs (จำนวน + ค่าธรรมเนียม)
// สร้างธุรกรรมทั้งหมดบนอุปกรณ์
ให้ tx = TxBuilder(.bitcoin)
.เพิ่ม (อินพุต)
.send(จำนวนเงิน, ถึง: ผู้รับ)
.change(เป็น: wallet.changeAddress).build()
// คุณตรวจสอบทุกรายละเอียดก่อนที่จะมีการเคลื่อนไหว
ปัจจุบัน (ยืนยัน: tx.summary)
// จำนวน · ค่าธรรมเนียม · ผู้รับ — ยังไม่มีการส่งเลย
1 / 4
ได้รับคีย์การลงนามแล้ว
คีย์ลูกต่ออินพุตได้รับมาจากเส้นทาง BIP-32
// รับรหัสลูกสำหรับอินพุตนี้ (BIP-32)
ให้คีย์ = masterKey.derive("m/84'/0'/0'/0/\(i)")
// แฮช preimage ของธุรกรรม (double SHA-256)
ให้ h = SHA256(SHA256(tx.preimage(i)))
// ลงชื่อเข้าใช้Secure Enclave (ต้องมี Face ID)
ให้ sig = ลอง SecureEnclave.sign(h, คีย์: คีย์,
เส้นโค้ง:.secp256k1)
// มีเพียงไบต์ที่ลงนามเท่านั้นที่ออกจากอุปกรณ์
tx.attach(sig, อินพุต: i)
เครือข่ายออกอากาศ (tx.serialized)
ทำให้ง่ายขึ้นจาก Swift โอเพ่นซอร์สของAperture ซึ่งเป็นอัลกอริทึมจริงบนอุปกรณ์ของคุณ
อ่านแหล่งที่มาแบบเต็มสังเกตว่ามีอะไรหายไป: ไม่มีเซิร์ฟเวอร์ ไม่มีบัญชี ไม่มีคีย์ที่จะข้ามเครือข่าย รหัสส่วนตัวถูกสร้างขึ้น จัดเก็บ และใช้ทั้งหมดภายในSecure Enclave ของอุปกรณ์ของคุณ