작동 방식 —Aperture

후드 아래

실제 코드.
진정한 안전.

이는 지갑을 생성하고, 복원하고, 자금을 이동할 때 장치에서 일어나는 일이며, 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 내부에서 완전히 생성, 저장 및 사용됩니다.