후드 아래
실제 코드.
진정한 안전.
이는 지갑을 생성하고, 복원하고, 자금을 이동할 때 장치에서 일어나는 일이며, iPhone에서 실행되는 오픈 소스 코드를 통해 단계별로 추적됩니다.
1 / 5
128비트의 진정한 무작위성
CSPRNG 시스템은 전체 지갑의 단일 소스인 장치에 원시 엔트로피를 생성합니다.
// 시스템 CSPRNG의 128비트 엔트로피
var 엔트로피 = 데이터(개수: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropy)
// 체크섬 = SHA-256의 첫 번째 비트(엔트로피)
체크섬 = SHA256.hash(데이터: 엔트로피).prefix(1)
비트 = 엔트로피 + 체크섬
// 각 11비트 그룹을 BIP-39 단어 목록에 매핑합니다.
니모닉 = 비트.청크(of: 11)
.map { wordlist[$0] } // 12단어
// 512비트 시드로 확장(PBKDF2-HMAC-SHA512)
시드 = PBKDF2.sha512(mnemonic.joined(" "),
소금: "니모닉", 라운드: 2048)
//Secure Enclave에 봉인합니다. 절대 떠나지 않습니다.
Keychain.store(seed, access:.thisDeviceOnly,
생체 인식:.faceID)
1 / 4
당신은 당신의 문구를 입력
로컬로 입력되며 어디에도 전송되지 않습니다.
// 입력한 문구를 읽습니다 — 전송되지 않습니다
단어 =phrase.lowercased().split(" ")
// 모든 단어는 BIP-39 목록에 존재해야 합니다.
가드 단어.allSatisfy(wordlist.contains)
else { WalletError.unknownWord 발생 }
// 체크섬을 다시 계산하고 확인합니다.
let (엔트로피, 합계) = word.toEntropy()
가드 SHA256.hash(데이터: 엔트로피).verify(합계)
else { WalletError.badChecksum 발생 }
// 생성과 동일한 파생 — 완전 오프라인
시드 = PBKDF2.sha512(words.joined(" "),
소금: "니모닉", 라운드: 2048)
Keychain.store(seed, access:.thisDeviceOnly)를 사용해 보세요.
1 / 3
당신의 코인이 선택되었습니다
입력은 사용되지 않은 출력에서 나오므로 제3자가 관여하지 않습니다.
// 사용하지 않은 출력에서 코인을 선택합니다.
입력 = wallet.selectUTXOs(금액 + 수수료)
// 트랜잭션 전체를 기기에서 구축합니다.
tx = TxBuilder(.bitcoin)로 설정
.add(입력)
.send(금액, 받는 사람: 받는 사람)
.change(to: wallet.changeAddress).build()
// 이동하기 전에 모든 세부 사항을 검토합니다.
현재(확인: tx.summary)
// 금액 · 수수료 · 수신자 - 아직 전송된 것이 없습니다.
1 / 4
서명 키가 파생됩니다.
입력별 하위 키는 BIP-32 경로를 통해 파생됩니다.
// 이 입력에 대한 하위 키를 파생합니다(BIP-32)
키 = masterKey.derive("m/84'/0'/0'/0/\(i)")
// 트랜잭션 사전 이미지를 해시합니다(이중 SHA-256).
h = SHA256(SHA256(tx.preimage(i)))라고 합시다.
//Secure Enclave 내부에 로그인합니다(Face ID 필요).
let sig = SecureEnclave.sign(h, key: key,
곡선:.secp256k1)
// 서명된 바이트만 장치를 떠납니다.
tx.attach(sig, 입력: i)
네트워크.브로드캐스트(tx.serialized)
Aperture의 오픈 소스 Swift로 단순화되었습니다. 실제 알고리즘이 장치에 적용됩니다.
전체 소스 읽기누락된 사항을 확인하세요. 서버도 없고, 계정도 없고, 네트워크를 통과하는 키도 없습니다. 개인 키는 장치의Secure Enclave 내부에서 완전히 생성, 저장 및 사용됩니다.