Glossário / Carteiras e custódia
Semente de carteira HD
Outros nomes: Root seed.
- O que é a semente de carteira HD?
- A semente de carteira HD é o número binário bruto, de 128 a 512 bits, que o BIP-32 introduz em um único hash para produzir a chave mestra e o código de cadeia de uma carteira.
Especificação no BIP-32.
As carteiras falam de palavras porque as pessoas conseguem copiar palavras à mão, mas o BIP-32 nunca vê palavras. Ele consome uma sequência de bytes e produz uma chave mestra em uma única passagem de HMAC-SHA512, tendo como chave o texto fixo "Bitcoin seed". As palavras são uma codificação popular dessa sequência de bytes, e não a única em uso.
Como funciona
O BIP-32 especifica uma semente de entre 128 e 512 bits, recomenda 256 e não diz nada sobre de onde vêm esses bits. A semente entra no HMAC-SHA512 como a mensagem, com a sequência ASCII "Bitcoin seed" como chave. A função devolve 64 bytes. Os 32 da esquerda se tornam a chave privada mestra; os 32 da direita se tornam o código de cadeia mestra, o segredo extra que impede que uma chave filha vazada exponha as chaves irmãs. Todo o resto em uma carteira, cada conta, cada endereço, cada saída de troco, descende desse par pela repetição de um hash semelhante com um número de índice.
A especificação inclui um caso extremo que nunca acontece na prática. Se esses 32 bytes da esquerda saírem como zero, ou como um valor igual ou superior à ordem da curva secp256k1, a semente é inválida e a carteira deve tentar de novo. A probabilidade é de cerca de uma em 2 elevado a 127, então nenhuma implementação já relatou ter chegado a esse caso.
De onde vêm os bits é uma camada à parte, e há várias respostas. O BIP-39 sempre emite exatamente 512 bits ao passar o mnemônico pelo PBKDF2. A Electrum passa a própria frase pelo PBKDF2 com um sal diferente e obtém uma semente que nenhuma ferramenta BIP-39 jamais reproduzirá a partir das mesmas palavras. Uma carteira também pode pegar 256 bits diretamente de um gerador de números aleatórios de hardware e nunca mostrar frase alguma, que é o que o Bitcoin Core faz.
O sentido do percurso importa. Palavras se tornam uma semente; uma semente não se torna palavras. Quando uma carteira guarda apenas o valor bruto, nenhum software vai imprimir um mnemônico para ele, e é por isso que exportar “a semente” não substitui guardar a frase que a produziu.
Onde você vê isso
Pergunte ao Bitcoin Core sobre uma carteira e ele informa um hdseedid, uma impressão digital da semente, em vez de qualquer frase, porque o Core nunca implementou o BIP-39. A RPC sethdseed, adicionada na versão 0.17.0, podia instalar uma semente específica em uma carteira legada, e as carteiras de descritores se tornaram o padrão para carteiras recém-criadas no Bitcoin Core 23.0.
A documentação para desenvolvedores é o outro lugar onde isso aparece em público. O BIP-32 e o BIP-39 publicam vetores de teste que mostram a semente como 128 caracteres hexadecimais ao lado do mnemônico que a produziu, que é a ilustração mais clara disponível de que os dois são objetos diferentes.
O momento prático em que isso incomoda é a migração entre ferramentas. Algumas carteiras e especificações, incluindo os backups de semente da Coldcard e vários utilitários para desenvolvedores, importam ou exportam o valor bruto em vez de palavras. Entregar uma semente bruta a uma ferramenta que espera um mnemônico, ou o contrário, produz um erro ou, pior, uma carteira válida mas vazia. Verifique qual camada um campo está pedindo antes de colar qualquer coisa nele.
Semente de carteira HD vs frase de recuperação
A semente é um número; a frase é uma forma de escrever esse número. Manter as duas separadas explica várias coisas que de outro modo parecem mágica. É por isso que adicionar uma frase secreta opcional muda a semente e deixa suas palavras intactas. É por isso que a frase da Electrum e uma frase BIP-39 podem ser ambas doze palavras em inglês e ainda assim abrir carteiras diferentes. E é por isso que uma carteira que anuncia “importação de semente” pode se referir a um mnemônico, uma string hexadecimal ou uma chave privada estendida, três entradas que compartilham um apelido e nada mais.