Pular para o conteúdo
buybitcoinsmart

Glossário / Endereços e chaves

Código de cadeia

O que é um código de cadeia?
Um código de cadeia é o valor de 32 bytes de entropia extra que acompanha cada chave em uma carteira HD e entra em cada derivação de uma chave filha, para que as chaves não possam ser adivinhadas a partir de suas irmãs.

Especificação no BIP-32.

Metade de toda chave estendida não é uma chave. O BIP-32 divide um hash de 512 bits em uma chave de 256 bits e um código de cadeia de 256 bits, e uma string xpub carrega os dois, 111 caracteres no total. Se você entregar uma xpub, está entregando o código de cadeia junto, e é isso que permite ao destinatário derivar seus endereços futuros.

Como funciona

Um código de cadeia faz seu trabalho dentro de uma única chamada HMAC. Derivar uma chave filha executa HMAC-SHA512 com o código de cadeia da chave mãe como chave e a chave pública mãe mais um índice de quatro bytes como mensagem. O resultado de 64 bytes se divide pelo meio: os 32 bytes da esquerda são somados à chave privada mãe, módulo a ordem da curva, para dar a chave privada filha, e os 32 bytes da direita passam a ser o próprio código de cadeia da chave filha, que ela usará para suas próprias filhas.

O ponto do salt é quem pode percorrer a árvore. Uma chave pública sozinha não deriva nada, porque a função de derivação não é executada sem o código de cadeia correspondente. Por isso uma chave pública estendida não é simplesmente uma chave pública com um nome mais longo. É uma chave pública mais seu código de cadeia, e entregar esse par a alguém converte um ponto de uma curva em um ramo ilimitado e enumerável de endereços que você ainda não usou.

O BIP-32 documenta o perigo que decorre disso. Se um atacante tem sua chave pública estendida e também consegue uma chave privada filha não endurecida, subtrair o deslocamento derivado recupera a chave privada mãe e, com ela, cada chave irmã e cada descendente. A derivação endurecida existe para cortar esse caminho: em um passo endurecido, a mensagem do hash contém a chave privada mãe em vez da pública, então nenhuma quantidade de material público permite a alguém subir na árvore.

Onde você vê isso

Você nunca digita um código de cadeia, e nenhuma carteira voltada ao consumidor mostra um isoladamente. Ele viaja dentro de uma chave estendida. Strings Base58Check que começam com xpub ou xprv são decodificadas em 78 bytes dispostos como 4 bytes de versão, 1 byte de profundidade, uma impressão digital da chave mãe de 4 bytes, um número da chave filha de 4 bytes, o código de cadeia de 32 bytes e, por fim, a chave de 33 bytes, razão pela qual uma xpub ocupa 111 caracteres de texto.

É nas ferramentas para desenvolvedores que o campo se torna visível como campo. A RPC deriveaddresses do Bitcoin Core trabalha com descritores que incorporam chaves estendidas, bibliotecas como python-bip32 retornam o código de cadeia como um atributo separado, e um dispositivo de assinatura que exporta uma conta para uma configuração de watch-only está exportando exatamente esse par.

O nível de cautela adequado é o que você aplicaria a um histórico completo de transações, não o que aplicaria a uma senha. Um código de cadeia não pode assinar, então sozinho não faz você perder nada. Nas mãos de uma empresa de análise, de um backup na nuvem ou de qualquer pessoa que tenha colado uma xpub em um chamado de suporte, ele expõe cada pagamento daquele ramo, passado e futuro, e não há como revogar o acesso depois.

Código de cadeia vs chave privada

Um código de cadeia e uma chave privada são ambos 32 bytes de aparência aleatória, e só um dos dois pode gastar. A chave privada produz assinaturas. O código de cadeia não produz nada além de mais derivação, e é justamente por isso que as pessoas o subestimam: como não pode mover dinheiro, chaves públicas estendidas são coladas em planilhas compartilhadas, relatórios de erros e aplicativos de celular por pessoas que nunca fariam o mesmo com uma chave. O resultado é uma janela permanente para as finanças delas, não um roubo, e as duas falhas merecem nomes diferentes.

Não confundir com

Perguntas frequentes

Um código de cadeia é secreto?

Não é um segredo de gasto, mas é um segredo de privacidade. Qualquer pessoa que tenha seu código de cadeia e a chave pública correspondente pode derivar cada endereço daquele ramo e ler todo o histórico, então trate uma xpub exportada como dado financeiro privado.

Preciso anotar meu código de cadeia alguma vez?

Não. Sua frase de recuperação regenera a chave mestra e cada código de cadeia abaixo dela, então fazer backup das palavras cobre toda a árvore. Os códigos de cadeia só aparecem quando você exporta uma chave estendida ou trabalha com código de derivação bruto.

Termos relacionados

Mais em Endereços e chaves

Ler esta página em inglês