Como codificar em Base58
- Digite ou cole o texto em Entrada · Texto. A string Base58 aparece em Saída · Base58 enquanto você digita.
- Escolha o Alfabeto abaixo da saída: Bitcoin (o padrão, usado também pelo IPFS e pela Solana), Flickr ou Ripple.
- Para codificar bytes brutos em vez de texto, ajuste De em Hex ou Base64 e cole os bytes nesse formato. Uma chave pública ou um hash quase sempre são bytes, não texto.
- Clique em Base58 → Texto no seletor de direção para decodificar, ou abra o decodificador Base58, que mostra os bytes em hex.
Como a codificação Base58 funciona
O Base58 não corta a entrada em grupos fixos de bits como o Base64. Ele lê todos os bytes como um único número big-endian e escreve esse número em base 58, depois acrescenta um 1 para cada byte zero inicial. É por isso que um único byte alterado pode mudar a string inteira, e por isso o comprimento depende do valor, não só da quantidade de bytes.
O custo de tratar os dados como um único número cresce rápido com o tamanho, então esta ferramenta limita a entrada Base58 a 64 KB. Isso é muito mais do que qualquer chave, hash ou endereço precisa.
Os três alfabetos Base58
Os três usam os mesmos 58 caracteres (dígitos e letras sem 0, O, I, l), em ordens diferentes:
| Alfabeto | Começa com | Hello | 0x00 0x00 0x01 |
|---|---|---|---|
| Bitcoin | 123456789ABC… | 9Ajdvzr | 112 |
| Flickr | 123456789abc… | 9aJCVZR | 112 |
| Ripple | rpshnaf39wBU… | 9wjdvzi | rrp |
O Flickr inverte maiúsculas e minúsculas, e era usado pelo Flickr em URLs curtas de fotos. O alfabeto do Ripple começa com r, então os endereços do XRP Ledger, que têm byte de versão zero, começam com r, do mesmo jeito que os endereços Bitcoin começam com 1. Decodificar com o alfabeto errado geralmente funciona sem erro e dá bytes diferentes, então confira o alfabeto primeiro quando um valor não bater.
Zeros à esquerda e o prefixo 1
Como o Base58 trata os dados como um número, os bytes zero no início sumiriam. O formato os preserva escrevendo um 1 por byte zero:
| Bytes (hex) | Base58 |
|---|---|
00 | 1 |
00 00 | 11 |
00 01 | 12 |
ff | 5Q |
31 × 00, depois ff | 11111111111111111111111111111115Q |
32 × 00 | 11111111111111111111111111111111 |
A última linha é um endereço real: trinta e dois 1s é o System Program da Solana, cuja chave pública são 32 bytes zero. Os zeros à esquerda são onde o código Base58 escrito à mão mais erra, e um codificador que os descarta produz strings que decodificam para menos bytes.
Onde o Base58 é usado
- Endereços Bitcoin e chaves WIF. Endereços legados (
1…,3…) e chaves privadas WIF (5…,K…,L…) são Base58Check: Base58 com um byte de versão e um checksum. Endereços Bech32 (bc1…) são outra codificação. - IPFS CIDv0. Os identificadores
Qm…são Base58 simples de um multihash de 34 bytes:12(SHA-256),20(32 bytes de comprimento) e o digest. O cabeçalho12 20é o que faz todo CIDv0 começar comQm. - Solana. Endereços e chaves públicas são Base58 de 32 bytes (de 32 a 44 caracteres); assinaturas de transações são Base58 de 64 bytes (até 88 caracteres).
Base58 em Python
O Python não tem Base58 na biblioteca padrão. O algoritmo é curto o bastante para escrever à mão, e esta versão trata os zeros à esquerda:
ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"
def b58encode(data: bytes) -> str:
n = int.from_bytes(data, "big")
out = ""
while n:
n, r = divmod(n, 58)
out = ALPHABET[r] + out
zeros = len(data) - len(data.lstrip(b"\0"))
return "1" * zeros + out
b58encode(b"Hello") # '9Ajdvzr'
b58encode(bytes(32)) # '11111111111111111111111111111111'
Para código de produção, um pacote mantido, como o base58 do PyPI, também cobre o Base58Check. Padrões gerais de codificação em Python estão na página de Python.
Perguntas frequentes
Quais caracteres o Base58 deixa de fora?
O Base58 é o Base62 sem quatro caracteres parecidos: 0 (zero), O (o maiúsculo), I (i maiúsculo) e l (L minúsculo). Ele também não tem +, / nem =, então uma string Base58 pode ser selecionada com duplo clique como uma só palavra e usada numa URL sem escape.
Por que a saída Base58 começa com 1?
Cada 1 representa um byte zero no início da entrada. Um número puro perderia esses zeros, então o Base58 os escreve explicitamente. Os endereços Bitcoin começam com 1 porque o byte de versão deles é 0x00.
Base58 é o mesmo que Base58Check?
Não. Base58Check é Base58 aplicado a um payload com um checksum de 4 bytes de SHA-256 duplo anexado. Endereços Bitcoin e chaves privadas WIF o usam; endereços Solana e IPFS CIDv0 usam Base58 simples. Use a ferramenta Base58Check para a forma com checksum.
Quanto o Base58 fica maior que a entrada?
Cerca de 37% para dados aleatórios (log 256 / log 58 ≈ 1,366), um pouco mais que os 33% do Base64. O comprimento exato depende do valor: 32 bytes aleatórios dão 43 ou 44 caracteres, enquanto 32 bytes zero dão 32 uns.