When you are writing a Bitcoin address on paper, the goal is 100% accuracy. An address with an error in it becomes a completely different address, with an unrelated private key. This new private key is unlikely to be known by anyone, since there are 2^256 possible private keys in the Bitcoin cryptosystem. Any bitcoin sent to this new address will be lost.
Note: A Bitcoin address does have a layer of protection against transcription errors. There is a hash-based checksum embedded within it. Most errors will cause the address to have an invalid checksum value, and a well-constructed Bitcoin software tool will detect this and refuse to send bitcoin to the invalid address. Nonetheless: It is unlikely but possible that transcription errors might create a new address that is valid but whose private key is unknown, and any bitcoin sent to it would be lost.
Here is an example Bitcoin private key:
7972b641101c0ad67b0e401b800a9b6f3225c97fc6b8115042cf66968c2fb2e5
And the corresponding Bitcoin address:
16ASCUS3s7D4UQh6J9oHGuT19agPvD3PFj
The possible characters in a Bitcoin address are:
- 0-9 with no 0
- A-Z with no I or O
- a-z with no l
The 0, I, O, and l characters were excluded due to possible confusion with i and o.
Approach 1: Single line
Write down the address in exactly the form shown here:
16ASCUS3s7D4UQh6J9oHGuT19agPvD3PFj
This is the address format that a Bitcoin software tool would accept.
Problems:
- It's difficult to tell if you've skipped a character.
- If you are making another copy of this address (by writing it out again on another piece of paper), then it will be difficult to compare the two copies against each other and confirm that they are the same.
Approach 2: Grid pattern
I prefer to divide an address into groups of 4 characters and lines of 4 groups. Usually, some letters will be left over that do not form a complete group.
16AS CUS3 s7D4 UQh6
J9oH GuT1 9agP vD3P
Fj
J9oH GuT1 9agP vD3P
Fj
With this format, it's easier to:
- Read on a computer screen and write onto paper.
- Read on paper and type into an offline computer.
- Compare two keys and find any differences.
The division process can be automated:
[spiano@shovel ~]$ echo -n "16ASCUS3s7D4UQh6J9oHGuT19agPvD3PFj" | fold --width 16 | sed 's/.\{4\}/& /g'; echo "";
16AS CUS3 s7D4 UQh6
J9oH GuT1 9agP vD3P
Fj
Notes on writing a Bitcoin address clearly on paper
When writing an Bitcoin address on paper, I have found it best to take these steps in order to reduce ambiguity:
- Underline every capital letter, taking care not to allow the underline to touch the character or any other nearby character.
- For a "1" character, include the extra bottom and diagonal lines (i.e. "1"), rather than writing only a single vertical line (i.e. "|").
- Add a tail to u/U to distinguish it from v/V.
- Cross the middle of z/Z to distinguish it from 2.
- Cross the top of a capital J to distinguish it from j.
- Be careful when underlining F, as if the underline is too close, it could look like E.
- Make sure to close the loop properly on 6, so that it doesn't look like G. Similarly, be careful not to close the loop on G, so that it doesn't look like 6.
- Underline 6 to distinguish it from b. This makes the overall underlining rule into "Underline capital letters and 6, and be careful when underlining F".
- Extend the tail in g so that it forms into a loop, preventing g from looking like q or 9.
- Add an upwards-diagonal tail to q, so that it doesn't look like 9.
[start of notes]
This article consists of information originally published in An investigation into recovering from transcription errors in Bitcoin private keys, re-edited to focus on the titular problem.
[end of notes]