Como funciona –Aperture

Sob o capô

Código real.
Segurança de verdade.

Isso é exatamente o que acontece no seu dispositivo quando você cria uma carteira, restaura uma e movimenta fundos – rastreados, passo a passo, por meio do código-fonte aberto executado no seu iPhone.

1 / 5

128 bits de verdadeira aleatoriedade

O sistema CSPRNG produz entropia bruta no seu dispositivo – a única fonte de toda a sua carteira.

// 128 bits de entropia do sistema CSPRNG
var entropia = Dados (contagem: 16)
SecRandomCopyBytes(kSecRandomDefault, 16, &entropia)
// checksum = primeiros bits do SHA-256(entropia)
deixe soma de verificação = SHA256.hash(dados: entropia).prefix(1)
deixe bits = entropia + soma de verificação
// mapeia cada grupo de 11 bits para a lista de palavras BIP-39
deixe mnemônico = bits.chunks (de: 11)
.map { lista de palavras[$0] } // 12 palavras
// esticar para uma semente de 512 bits (PBKDF2-HMAC-SHA512)
deixe semente = PBKDF2.sha512(mnemonic.joined(" "),
sal: "mnemônico", rodadas: 2048)
// sela oSecure Enclave — ele nunca sai
tente Keychain.store (seed, acesso:.thisDeviceOnly,
biometria:.faceID)
1 / 4

Você digita sua frase

Ele — inserido localmente e nunca transmitido para lugar nenhum.

// lê a frase que você digita — nunca transmitida
deixe palavras = frase.lowercased().split(" ")
// cada palavra deve existir na lista BIP-39
guardar palavras.allSatisfy (lista de palavras. contém)
senão { lançar WalletError.unknownWord }
//recalcula e verifica a soma de verificação
deixe (entropia, soma) = palavras.toEntropy()
guarda SHA256.hash(dados: entropia).verifica(soma)
senão { lançar WalletError.badChecksum }
// mesma derivação da geração — totalmente offline
deixe semente = PBKDF2.sha512(palavras.joined(" "),
sal: "mnemônico", rodadas: 2048)
tente Keychain.store (seed, acesso:.thisDeviceOnly)
1 / 3

Suas próprias moedas são selecionadas

As entradas vêm de suas saídas não gastas – nenhum terceiro está envolvido.

// escolhe moedas de suas próprias saídas não gastas
deixe entradas = wallet.selectUTXOs(valor + taxa)
// cria a transação inteiramente no dispositivo
deixe tx = TxBuilder (.bitcoin)
.add(entradas)
.enviar(valor, para: destinatário)
.change(para: wallet.changeAddress).build()
// você revisa cada detalhe antes de qualquer coisa acontecer
presente (confirmar: tx.summary)
// valor · taxa · destinatário — nada enviado ainda
1 / 4

A chave de assinatura é derivada

Uma chave filha por entrada é derivada por meio do caminho BIP-32.

// deriva a chave filha para esta entrada (BIP-32)
deixe chave = masterKey.derive("m/84'/0'/0'/0/\(i)")
// hash da pré-imagem da transação (duplo SHA-256)
deixe h = SHA256(SHA256(tx.preimage(i)))
// assine dentro doSecure Enclave (precisa de Face ID)
deixe sig = tente SecureEnclave.sign(h, chave: chave,
curva:.secp256k1)
// somente bytes assinados saem do dispositivo
tx.attach(sig, entrada: i)
rede.broadcast(tx.serializado)

Simplificado a partir do Swift de código aberto doAperture - os algoritmos reais, no seu dispositivo.

Leia a fonte completa

Observe o que está faltando: nenhum servidor, nenhuma conta, nenhuma chave cruzando a rede. A chave privada é criada, armazenada e usada inteiramente dentro doSecure Enclave do seu dispositivo.