यह कैसे काम करता हैAperture

हुड के नीचे

असली कोड.
वास्तविक सुरक्षा.

आपके डिवाइस पर ठीक यही होता है जब आप एक वॉलेट बनाते हैं, उसे पुनर्स्थापित करते हैं, और धनराशि स्थानांतरित करते हैं - आपके iPhone पर चलने वाले ओपन-सोर्स कोड के माध्यम से चरण दर चरण पता लगाया जाता है।

1 / 5

वास्तविक यादृच्छिकता के 128 बिट्स

सिस्टम CSPRNG आपके डिवाइस पर कच्ची एन्ट्रापी उत्पन्न करता है - आपके संपूर्ण वॉलेट का एकल स्रोत।

// सीएसपीआरएनजी सिस्टम से एन्ट्रापी के 128 बिट्स
वर एन्ट्रॉपी = डेटा(गिनती: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &एन्ट्रॉपी)
// चेकसम = SHA-256 का पहला बिट्स (एन्ट्रॉपी)
मान लीजिए चेकसम = SHA256.हैश(डेटा: एन्ट्रॉपी).उपसर्ग(1)
चलो बिट्स = एन्ट्रापी + चेकसम
// प्रत्येक 11-बिट समूह को BIP-39 वर्डलिस्ट में मैप करें
चलो स्मरणीय = बिट्स.चंक्स (का: 11)
.map { शब्दसूची[$0] } // 12 शब्द
// 512-बिट बीज तक फैलाएं (PBKDF2-HMAC-SHA512)
मान लीजिए बीज = PBKDF2.sha512(mnemonic.joined(" "),
नमक: "स्मृति", गोल: 2048)
//Secure Enclave में सील - यह कभी नहीं छूटती
Keyचेन.स्टोर आज़माएं (बीज, पहुंच:.thisDeviceOnly,
बायोमेट्री:.faceID)
1 / 4

आप अपना वाक्यांश टाइप करें

इसे स्थानीय रूप से दर्ज किया जाता है और इसे कहीं भी प्रसारित नहीं किया जाता है।

// आपके द्वारा टाइप किया गया वाक्यांश पढ़ें - कभी प्रसारित नहीं हुआ
चलो शब्द = वाक्यांश.लोअरकेस्ड().स्प्लिट(" ")
// प्रत्येक शब्द BIP-39 सूची में मौजूद होना चाहिए
गार्ड शब्द.सभीसंतुष्ट(शब्दसूची.शामिल)
अन्यथा { थ्रो वॉलेट एरर.अननोन वर्ड }
// चेकसम की पुनः गणना और सत्यापन करें
चलो (एन्ट्रॉपी, योग) = शब्द.टूएंट्रॉपी()
गार्ड SHA256.हैश(डेटा: एन्ट्रॉपी).सत्यापित करता है(योग)
अन्यथा { थ्रो वॉलेट एरर.बैड चेकसम }
// पीढ़ी के समान व्युत्पत्ति - पूरी तरह से ऑफ़लाइन
चलो बीज = PBKDF2.sha512(शब्द.जुड़े(" "),
नमक: "स्मृति", गोल: 2048)
Keyचेन.स्टोर आज़माएं (बीज, पहुंच:.thisDeviceOnly)
1 / 3

आपके अपने सिक्के चुने गए हैं

इनपुट आपके अव्ययित आउटपुट से आते हैं - कोई तीसरा पक्ष शामिल नहीं है।

// अपने स्वयं के अव्ययित आउटपुट से सिक्के चुनें
लेट इनपुट = वॉलेट.selectUTXOs(राशि + शुल्क)
// लेनदेन को पूरी तरह से डिवाइस पर बनाएं
चलो tx = TxBuilder(.bitcoin)
.जोड़ें(इनपुट)
.भेजें(राशि, को: प्राप्तकर्ता)
.change(में: वॉलेट.चेंजएड्रेस).बिल्ड()
// कुछ भी आगे बढ़ने से पहले आप हर विवरण की समीक्षा करते हैं
वर्तमान(पुष्टि करें: tx.सारांश)
// राशि · शुल्क · प्राप्तकर्ता - अभी तक कुछ भी नहीं भेजा गया
1 / 4

हस्ताक्षर कुंजी प्राप्त हो गई है

प्रति-इनपुट चाइल्ड कुंजी BIP-32 पथ के माध्यम से प्राप्त की जाती है।

// इस इनपुट के लिए चाइल्ड कुंजी प्राप्त करें (बीआईपी-32)
Let key = masterKey.derive("m/84'/0'/0'/0/\(i)")
// लेन-देन प्रीइमेज को हैश करें (डबल SHA-256)
मान लीजिए h = SHA256(SHA256(tx.preimage(i)))
//Secure Enclave के अंदर साइन इन करें (फेस आईडी की आवश्यकता है)
आइए हस्ताक्षर करें = सिक्योरएनक्लेव.साइन (एच, कुंजी: कुंजी, आज़माएं)
वक्र:.secp256k1)
// केवल हस्ताक्षरित बाइट्स ही डिवाइस छोड़ते हैं
tx.attach(sig, इनपुट: i)
नेटवर्क.प्रसारण(tx.serialized)

Aperture के ओपन-सोर्स स्विफ्ट से सरलीकृत - आपके डिवाइस पर वास्तविक एल्गोरिदम।

पूरा स्रोत पढ़ें

ध्यान दें कि क्या गायब है: कोई सर्वर नहीं, कोई खाता नहीं, कोई कुंजी कभी भी नेटवर्क को पार नहीं कर रही है। निजी कुंजी पूरी तरह से आपके डिवाइस केSecure Enclave के अंदर बनाई, संग्रहीत और उपयोग की जाती है।