Introduce base256emoji for use as the primary input and display for account addresses in all user interfaces.
Motivation
Human users often fail to distinguish between long strings of hexadecimal characters, especially when they match at the beginning and at the end.
This makes hexadecimal strings a poor format for human-readable account addresses.
The problem is being exploited by several spoofing strategies that mine similar addresses and spoof ERC-20 Transfer events with the goal of tricking the end user into copying the wrong recipient address.
These address spoofing attacks have mislead tens of thousands of ether, and countless other tokens.
Spoofers flooding the network with fake Transfer events waste network resources and complicate blockchain accounting.
Improving the distinguishability of addresses will reduce the incentives for this behavior.
Specification
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119 and RFC 8174.
User interfaces:
SHALL depict account addresses as a base256emoji string instead of hexadecimal.
SHALL accept base256emoji strings as input for user-supplied account address parameters.
SHOULD recognize and interpret strings of exactly 20 consecutive emoji as addresses when all of them are valid base256emoji.
base256emoji encoding table
Emoji
Unicode codepoint
Byte Value
๐
U+1F680
0
๐ช
U+1FA90
1
โ
U+2604
2
๐ฐ
U+1F6F0
3
๐
U+1F30C
4
๐
U+1F311
5
๐
U+1F312
6
๐
U+1F313
7
๐
U+1F314
8
๐
U+1F315
9
๐
U+1F316
10
๐
U+1F317
11
๐
U+1F318
12
๐
U+1F30D
13
๐
U+1F30F
14
๐
U+1F30E
15
๐
U+1F409
16
โ
U+2600
17
๐ป
U+1F4BB
18
๐ฅ
U+1F5A5
19
๐พ
U+1F4BE
20
๐ฟ
U+1F4BF
21
๐
U+1F602
22
โค
U+2764
23
๐
U+1F60D
24
๐คฃ
U+1F923
25
๐
U+1F60A
26
๐
U+1F64F
27
๐
U+1F495
28
๐ญ
U+1F62D
29
๐
U+1F618
30
๐
U+1F44D
31
๐
U+1F605
32
๐
U+1F44F
33
๐
U+1F601
34
๐ฅ
U+1F525
35
๐ฅฐ
U+1F970
36
๐
U+1F494
37
๐
U+1F496
38
๐
U+1F499
39
๐ข
U+1F622
40
๐ค
U+1F914
41
๐
U+1F606
42
๐
U+1F644
43
๐ช
U+1F4AA
44
๐
U+1F609
45
โบ
U+263A
46
๐
U+1F44C
47
๐ค
U+1F917
48
๐
U+1F49C
49
๐
U+1F614
50
๐
U+1F60E
51
๐
U+1F607
52
๐น
U+1F339
53
๐คฆ
U+1F926
54
๐
U+1F389
55
๐
U+1F49E
56
โ
U+270C
57
โจ
U+2728
58
๐คท
U+1F937
59
๐ฑ
U+1F631
60
๐
U+1F60C
61
๐ธ
U+1F338
62
๐
U+1F64C
63
๐
U+1F60B
64
๐
U+1F497
65
๐
U+1F49A
66
๐
U+1F60F
67
๐
U+1F49B
68
๐
U+1F642
69
๐
U+1F493
70
๐คฉ
U+1F929
71
๐
U+1F604
72
๐
U+1F600
73
๐ค
U+1F5A4
74
๐
U+1F603
75
๐ฏ
U+1F4AF
76
๐
U+1F648
77
๐
U+1F447
78
๐ถ
U+1F3B6
79
๐
U+1F612
80
๐คญ
U+1F92D
81
โฃ
U+2763
82
๐
U+1F61C
83
๐
U+1F48B
84
๐
U+1F440
85
๐ช
U+1F62A
86
๐
U+1F611
87
๐ฅ
U+1F4A5
88
๐
U+1F64B
89
๐
U+1F61E
90
๐ฉ
U+1F629
91
๐ก
U+1F621
92
๐คช
U+1F92A
93
๐
U+1F44A
94
๐ฅณ
U+1F973
95
๐ฅ
U+1F625
96
๐คค
U+1F924
97
๐
U+1F449
98
๐
U+1F483
99
๐ณ
U+1F633
100
โ
U+270B
101
๐
U+1F61A
102
๐
U+1F61D
103
๐ด
U+1F634
104
๐
U+1F31F
105
๐ฌ
U+1F62C
106
๐
U+1F643
107
๐
U+1F340
108
๐ท
U+1F337
109
๐ป
U+1F63B
110
๐
U+1F613
111
โญ
U+2B50
112
โ
U+2705
113
๐ฅบ
U+1F97A
114
๐
U+1F308
115
๐
U+1F608
116
๐ค
U+1F918
117
๐ฆ
U+1F4A6
118
โ
U+2714
119
๐ฃ
U+1F623
120
๐
U+1F3C3
121
๐
U+1F490
122
โน
U+2639
123
๐
U+1F38A
124
๐
U+1F498
125
๐
U+1F620
126
โ
U+261D
127
๐
U+1F615
128
๐บ
U+1F33A
129
๐
U+1F382
130
๐ป
U+1F33B
131
๐
U+1F610
132
๐
U+1F595
133
๐
U+1F49D
134
๐
U+1F64A
135
๐น
U+1F639
136
๐ฃ
U+1F5E3
137
๐ซ
U+1F4AB
138
๐
U+1F480
139
๐
U+1F451
140
๐ต
U+1F3B5
141
๐ค
U+1F91E
142
๐
U+1F61B
143
๐ด
U+1F534
144
๐ค
U+1F624
145
๐ผ
U+1F33C
146
๐ซ
U+1F62B
147
โฝ
U+26BD
148
๐ค
U+1F919
149
โ
U+2615
150
๐
U+1F3C6
151
๐คซ
U+1F92B
152
๐
U+1F448
153
๐ฎ
U+1F62E
154
๐
U+1F646
155
๐ป
U+1F37B
156
๐
U+1F343
157
๐ถ
U+1F436
158
๐
U+1F481
159
๐ฒ
U+1F632
160
๐ฟ
U+1F33F
161
๐งก
U+1F9E1
162
๐
U+1F381
163
โก
U+26A1
164
๐
U+1F31E
165
๐
U+1F388
166
โ
U+274C
167
โ
U+270A
168
๐
U+1F44B
169
๐ฐ
U+1F630
170
๐คจ
U+1F928
171
๐ถ
U+1F636
172
๐ค
U+1F91D
173
๐ถ
U+1F6B6
174
๐ฐ
U+1F4B0
175
๐
U+1F353
176
๐ข
U+1F4A2
177
๐ค
U+1F91F
178
๐
U+1F641
179
๐จ
U+1F6A8
180
๐จ
U+1F4A8
181
๐คฌ
U+1F92C
182
โ
U+2708
183
๐
U+1F380
184
๐บ
U+1F37A
185
๐ค
U+1F913
186
๐
U+1F619
187
๐
U+1F49F
188
๐ฑ
U+1F331
189
๐
U+1F616
190
๐ถ
U+1F476
191
๐ฅด
U+1F974
192
โถ
U+25B6
193
โก
U+27A1
194
โ
U+2753
195
๐
U+1F48E
196
๐ธ
U+1F4B8
197
โฌ
U+2B07
198
๐จ
U+1F628
199
๐
U+1F31A
200
๐ฆ
U+1F98B
201
๐ท
U+1F637
202
๐บ
U+1F57A
203
โ
U+26A0
204
๐
U+1F645
205
๐
U+1F61F
206
๐ต
U+1F635
207
๐
U+1F44E
208
๐คฒ
U+1F932
209
๐ค
U+1F920
210
๐คง
U+1F927
211
๐
U+1F4CC
212
๐ต
U+1F535
213
๐
U+1F485
214
๐ง
U+1F9D0
215
๐พ
U+1F43E
216
๐
U+1F352
217
๐
U+1F617
218
๐ค
U+1F911
219
๐
U+1F30A
220
๐คฏ
U+1F92F
221
๐ท
U+1F437
222
โ
U+260E
223
๐ง
U+1F4A7
224
๐ฏ
U+1F62F
225
๐
U+1F486
226
๐
U+1F446
227
๐ค
U+1F3A4
228
๐
U+1F647
229
๐
U+1F351
230
โ
U+2744
231
๐ด
U+1F334
232
๐ฃ
U+1F4A3
233
๐ธ
U+1F438
234
๐
U+1F48C
235
๐
U+1F4CD
236
๐ฅ
U+1F940
237
๐คข
U+1F922
238
๐
U+1F445
239
๐ก
U+1F4A1
240
๐ฉ
U+1F4A9
241
๐
U+1F450
242
๐ธ
U+1F4F8
243
๐ป
U+1F47B
244
๐ค
U+1F910
245
๐คฎ
U+1F92E
246
๐ผ
U+1F3BC
247
๐ฅต
U+1F975
248
๐ฉ
U+1F6A9
249
๐
U+1F34E
250
๐
U+1F34A
251
๐ผ
U+1F47C
252
๐
U+1F48D
253
๐ฃ
U+1F4E3
254
๐ฅ
U+1F942
255
Rationale
Previous attempts to reduce spoofing and other copy errors such as ERC-55 have not reduced the number of characters in an address.
Any base-256 standard would achieve this goal but emoji were chosen to maximize human-distinguishability.
Multiple base-256 emoji encodings have been proposed.
The base256emoji encoding was chosen due to its acceptance into the multibase repository.
This standard does not also recommend base256emoji for use in depicting other bytestrings such as transaction hashes and calldata.
Transaction hashes are not yet being spoofed.
Calldata is best decoded via the appropriate ABI.
By only using base256emoji for addresses, addresses can be easily noticed among other information.
Backwards Compatibility
Using the encoding table, the base256emoji encoding can be transcoded into hexadecimal and vice-versa.
to_emoji=['๐','๐ช','โ','๐ฐ','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','๐','โ','๐ป','๐ฅ','๐พ','๐ฟ','๐','โค','๐','๐คฃ','๐','๐','๐','๐ญ','๐','๐','๐ ','๐','๐','๐ฅ','๐ฅฐ','๐','๐','๐','๐ข','๐ค','๐','๐','๐ช','๐','โบ','๐','๐ค','๐','๐','๐','๐','๐น','๐คฆ','๐','๐','โ','โจ','๐คท','๐ฑ','๐','๐ธ','๐','๐','๐','๐','๐','๐','๐','๐','๐คฉ','๐','๐','๐ค','๐','๐ฏ','๐','๐','๐ถ','๐','๐คญ','โฃ','๐','๐','๐','๐ช','๐','๐ฅ','๐','๐','๐ฉ','๐ก','๐คช','๐','๐ฅณ','๐ฅ','๐คค','๐','๐','๐ณ','โ','๐','๐','๐ด','๐','๐ฌ','๐','๐','๐ท','๐ป','๐','โญ','โ ','๐ฅบ','๐','๐','๐ค','๐ฆ','โ','๐ฃ','๐','๐','โน','๐','๐','๐ ','โ','๐','๐บ','๐','๐ป','๐','๐','๐','๐','๐น','๐ฃ','๐ซ','๐','๐','๐ต','๐ค','๐','๐ด','๐ค','๐ผ','๐ซ','โฝ','๐ค','โ','๐','๐คซ','๐','๐ฎ','๐','๐ป','๐','๐ถ','๐','๐ฒ','๐ฟ','๐งก','๐','โก','๐','๐','โ','โ','๐','๐ฐ','๐คจ','๐ถ','๐ค','๐ถ','๐ฐ','๐','๐ข','๐ค','๐','๐จ','๐จ','๐คฌ','โ','๐','๐บ','๐ค','๐','๐','๐ฑ','๐','๐ถ','๐ฅด','โถ','โก','โ','๐','๐ธ','โฌ','๐จ','๐','๐ฆ','๐ท','๐บ','โ ','๐ ','๐','๐ต','๐','๐คฒ','๐ค ','๐คง','๐','๐ต','๐ ','๐ง','๐พ','๐','๐','๐ค','๐','๐คฏ','๐ท','โ','๐ง','๐ฏ','๐','๐','๐ค','๐','๐','โ','๐ด','๐ฃ','๐ธ','๐','๐','๐ฅ','๐คข','๐ ','๐ก','๐ฉ','๐','๐ธ','๐ป','๐ค','๐คฎ','๐ผ','๐ฅต','๐ฉ','๐','๐','๐ผ','๐','๐ฃ','๐ฅ']from_emoji={emoji:"{0:02x}".format(i)fori,emojiinenumerate(to_emoji)}defencode_address(hexadecimal_address):iflen(hexadecimal_address)!=42ornothexadecimal_address.startswith('0x'):returnNonereturn''.join([to_emoji[int(hexadecimal_address[i:i+2],16)]foriinrange(2,42,2)])defdecode_address(emoji_address):# In python, these unicode characters all have a len() of 1
iflen(emoji_address)!=20:returnNonetry:return'0x'+''.join(from_emoji[emoji]foremojiinemoji_address)exceptIndexError:returnNone
Security Considerations
With the base256emoji encoding, addresses use half as many characters.
The characters used are more distinguishable.
This squares the difficulty of generating similar addresses, making address spoofing impractical.