User Rating 0.0 โ˜…โ˜…โ˜…โ˜…โ˜…
Total Usage 0 times
ASCII recommended. Multi-byte UTF-8 characters use more payload space.
Is this tool helpful?

Your feedback helps us improve.

โ˜… โ˜… โ˜… โ˜… โ˜…

About

Bitcoin transactions can embed arbitrary data by encoding text into the 20-byte payload of P2PKH addresses. Each address carries up to 20 bytes of ASCII data, prefixed with version byte 0x00 and suffixed with a 4-byte checksum derived from double SHA-256 hashing. The resulting addresses are indistinguishable from real payment addresses at the protocol level. If you broadcast a transaction with these addresses as outputs, your message is stored permanently on the blockchain. This technique was notably used to embed the Len Sassaman tribute and Wikileaks cables. This tool performs real Base58Check encoding - not a simulation. It computes genuine SHA-256 checksums via the Web Crypto API and handles the full Base58 alphabet (excluding confusable characters 0, O, I, l). Limitation: payloads are not spendable. Funds sent to these addresses are permanently lost.

bitcoin base58 encode decode blockchain cryptocurrency address converter

Formulas

The Base58Check encoding process for each 20-byte text chunk:

payload = pad(UTF8bytes(textchunk), 20)
raw = 0x00 payload
checksum = SHA256(SHA256(raw))[0..3]
address = Base58(raw checksum)

where denotes byte concatenation, SHA256 is the SHA-256 cryptographic hash, and Base58 converts a big-endian integer to the 58-character Bitcoin alphabet. Leading zero bytes in the input map to leading 1s in the output. Decoding reverses: strip leading 1s, convert Base58 โ†’ integer โ†’ 25 bytes, verify the checksum matches, then extract bytes 1 - 20 as the text payload.

Reference Data

ParameterValueDescription
Version Byte0x00Mainnet P2PKH (prefix โ€œ1โ€)
Payload Size20 bytesRIPEMD-160 hash length (repurposed for data)
Checksum Size4 bytesFirst 4 bytes of double SHA-256
Total Raw Bytes25 bytes1 version + 20 payload + 4 checksum
Address Length25 - 34 charsBase58 encoded output
Base58 Alphabet58 chars123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz
Excluded Characters0, O, I, lRemoved to prevent visual ambiguity
Hash AlgorithmSHA-256Applied twice for checksum
Max Text per Address20 charsASCII characters (1 byte each)
Addresses for 140 chars7ceil(140 รท 20)
P2SH Version Byte0x05Prefix โ€œ3โ€ (not used here)
Testnet Version Byte0x6FPrefix โ€œmโ€ or โ€œnโ€ (not used here)
Bech32 Formatbc1...SegWit native (not used here)
OP_RETURN Limit80 bytesAlternative data embedding method
Dust Threshold546 satoshisMinimum output to avoid relay rejection

Frequently Asked Questions

Yes. Each address passes full Base58Check validation. The version byte is 0x00 (mainnet P2PKH) and the 4-byte checksum is computed via double SHA-256. Any Bitcoin node or wallet will accept these as syntactically valid addresses. However, the corresponding private keys are unknown, so any funds sent to them are irrecoverable.
OP_RETURN outputs are explicitly marked as unspendable and limited to 80 bytes per output. Address-based encoding disguises data as normal payment outputs (up to 20 bytes each) and requires a dust-level payment per output (546 satoshis minimum). OP_RETURN is the modern, preferred method. Address encoding is the older technique used in early blockchain messages.
The encoder uses UTF-8 byte representation. Multi-byte characters (e.g., emoji at 4 bytes, CJK at 3 bytes) consume more of the 20-byte payload per address. A single emoji could use 4 of the 20 available bytes. The decoder correctly reassembles multi-byte sequences across address boundaries.
Technically yes. You would construct a transaction with each generated address as a separate output, each funded above the dust threshold of 546 satoshis. The message becomes permanently embedded in the blockchain. Be aware this creates unspendable UTXOs, which is considered blockchain pollution by many node operators.
Each address payload is exactly 20 bytes. If the final chunk of your text is shorter, the remaining bytes are zero-padded. The decoder strips trailing null bytes (0x00) from the last address. In rare cases where your original text intentionally ends with null bytes, they will be lost.
Divide your message length in bytes by 20 and round up. A 140-character ASCII tweet needs ceil(140 รท 20) = 7 addresses. At 546 satoshis each, that costs 3822 satoshis in outputs plus the transaction fee.