Também disponível em: English · Español · Français · العربية
Codificar e decodificar base58
Codifique e decodifique base58 com qualquer um dos dois alfabetos, e veja o que acontece quando os dois são confundidos.
O que é base58?
Base58 é um jeito de escrever dados binários como texto, igual ao base64, mas pensado para sobreviver a ser lido por uma pessoa. Usa 58 caracteres em vez de 64, e os que descarta são a razão de existir: o zero, o O maiúsculo, o I maiúsculo e o ele minúsculo — os dois pares que quase ninguém distingue numa fonte comum — junto com o mais e a barra que o base64 usa e que quebram ao dar duplo clique ou ao pôr a cadeia numa URL.
O resultado não tem preenchimento, nem pontuação, nem quebras de linha. É uma sequência ininterrupta de letras e algarismos que você seleciona com um duplo clique, lê ao telefone ou copia de uma tela sem se perguntar se aquilo era um I ou um ele. É por isso que endereços de Bitcoin, hashes do IPFS e identificadores de conta do XRP Ledger usam todos ele.
E também, e esta é a parte que quase nenhuma ferramenta conta, não é um padrão.
Como usar o codificador
- Escolha a direção e o alfabeto. Codificar transforma bytes em base58; decodificar faz o contrário. O alfabeto importa — veja abaixo — e o do Bitcoin é quase com certeza o que você quer, a menos que trabalhe com o XRP Ledger.
- Digite ou cole a sua entrada. Ao codificar você pode pôr texto comum ou hex; ao decodificar, cole a cadeia base58. Qualquer caractere fora do alfabeto escolhido é recusado, e a ferramenta diz qual era.
- Olhe o segundo painel. Ele mostra os mesmos bytes codificados com o outro alfabeto, para você ver por conta própria como os dois resultados saem diferentes.
Não existe base58 padrão, e isso é um perigo real
O mais próximo de uma especificação é um rascunho da IETF, draft-msporny-base58, com status pretendido «informativo». Ele expirou em 2 de outubro de 2021 e nunca virou RFC. Todo o resto é convenção, e as convenções não coincidem.
As duas desta ferramenta vêm do código-fonte dos projetos que as definem: base58.cpp do Bitcoin Core e tokens.cpp do rippled. Usam exatamente o mesmo conjunto de 58 caracteres, e ordenam 23 desses 58 de outro jeito. Codifique «Hello, world» com o do Bitcoin e você recebe 2NEpo7TZsLFA2wMeK; com o do XRP Ledger, p4NFofTZ1LEwpAMeK.
Essa diferença é mais perigosa do que uma incompatibilidade declarada. Como os dois alfabetos contêm exatamente os mesmos caracteres, uma cadeia produzida por um é sempre uma cadeia sintaticamente válida para o outro. Entregue-a a um decodificador na convenção errada e você não recebe erro: recebe outros bytes, em silêncio. Nada dentro de uma cadeia base58 diz qual alfabeto a criou, então o formato não pode ajudar e nós também não; você precisa saber.
Um sintoma visível é o que acontece com os zeros à esquerda. Um byte zero no começo vira o primeiro caractere do alfabeto, que é o 1 no Bitcoin e o r no XRP Ledger. Então os mesmos três bytes 00 00 01 se escrevem 112 ou rrp, conforme o caso.
A regra dos zeros à esquerda, e por que se erra nela
Base58 é aritmética: trate a entrada como um único número enorme e divida repetidamente por 58. Isso funciona perfeitamente exceto por uma coisa — um número não lembra os seus zeros à esquerda. Os bytes 00 AB e AB são o mesmo inteiro, então um codificador puramente aritmético produz a mesma saída para os dois, e o tamanho dos seus dados muda ao decodificar.
A convenção resolve isso fora da aritmética. Os bytes zero iniciais são contados antes de a divisão começar e recolados depois, um caractere-zero do alfabeto para cada. É uma regra pregada à matemática, não uma consequência dela, e é exatamente por isso que ela é esquecida.
O Bitcoin Core publica 21 vetores de teste para base58, e sete deles carregam bytes zero à esquerda — uma proporção que parece deliberada, porque uma implementação que esqueça a regra passa nos outros catorze e parece correta. Este codificador passa nos 21 nos dois sentidos.
O que esta ferramenta não faz
Ela faz base58, não Base58Check. Endereços de Bitcoin não são base58 cru: são um byte de versão, a carga útil e uma soma de verificação de quatro bytes feita com um SHA-256 duplo, tudo codificado junto. Essa soma é o que permite a uma carteira recusar um endereço com um erro de digitação. Colar aqui um endereço de Bitcoin vai decodificá-lo corretamente para bytes, mas a ferramenta não vai verificar a soma nem dizer que o endereço é válido — ela é um codificador, não um validador de endereços, e confundir as duas coisas seria a escolha mais vistosa e menos honesta.
Ela também não tem opinião sobre o que os seus bytes significam. Base58 é transporte, então a saída decodificada aparece em hex, e como texto apenas quando os bytes por acaso são UTF-8 válido. Quando não são, a ferramenta diz isso em vez de mostrar caracteres de substituição, porque uma tela cheia de losangos com interrogação sugere que aquilo era texto e quebrou, quando em geral nunca foi texto.
Por que é grátis?
Tudo acontece no seu navegador. Nada do que você cola é enviado, registrado ou guardado — o que aqui importa mais do que na maioria das páginas, porque cadeias base58 costumam ser chaves, endereços e identificadores.
Sem conta, sem cadastro, sem limite e sem marca d'água em nada que você copiar.