ERC-7673: 区分明显的 base256emoji 地址
将账户地址描绘成一串 Emoji
Authors | William Morriss (@wjmelements) |
---|---|
Created | 2024-04-01 |
Discussion Link | https://ethereum-magicians.org/t/erc-7673-distinguishable-account-addresses/19461 |
摘要
引入 base256emoji,用作所有用户界面中账户地址的主要输入和显示。
动机
人类用户通常无法区分很长的十六进制字符字符串,尤其是当它们在开头和结尾匹配时。 这使得十六进制字符串成为人类可读账户地址的一种糟糕格式。 这个问题正被几种欺骗策略利用,这些策略挖掘相似的地址并欺骗 ERC-20 Transfer 事件,目的是诱骗最终用户复制错误的接收者地址。 这些地址欺骗攻击已经误导了成千上万的以太币和无数其他代币。 欺骗者用虚假的 Transfer 事件充斥网络,浪费网络资源并使区块链记账复杂化。 提高地址的可区分性将减少这种行为的动机。
规范
本文档中的关键词 “MUST”,“MUST NOT”,“REQUIRED”,“SHALL”,“SHALL NOT”,“SHOULD”,“SHOULD NOT”,“RECOMMENDED”,“NOT RECOMMENDED”,“MAY” 和 “OPTIONAL” 按照 RFC 2119 和 RFC 8174 中的描述进行解释。
用户界面:
- SHALL 将账户地址描绘为 base256emoji 字符串,而不是十六进制。
- SHALL 接受 base256emoji 字符串作为用户提供的帐户地址参数的输入。
- SHOULD 识别并解释正好由 20 个连续 emoji 组成的字符串作为地址,当它们都是有效的 base256emoji 时。
base256emoji 编码表
Emoji | Unicode 码位 | 字节值 |
---|---|---|
🚀 | 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 |
理由
以前减少欺骗和其他复制错误的尝试,例如 ERC-55,并没有减少地址中的字符数。 任何 base-256 标准都可以实现此目标,但选择 emoji 是为了最大限度地提高人类可区分性。 已经提出了多种 base-256 emoji 编码。 选择 base256emoji 编码是因为它已被接受到 multibase 存储库中。
本标准也不建议将 base256emoji 用于描绘其他字节串,例如交易哈希和 calldata。 交易哈希尚未被欺骗。 Calldata 最好通过适当的 ABI 进行解码。 通过仅将 base256emoji 用于地址,可以很容易地在其他信息中注意到地址。
向后兼容性
使用编码表,base256emoji 编码可以转码为十六进制,反之亦然。
测试用例
| base256emoji | ERC-55 |
|:-:|:-:|
|🚀🚀🚀🚀🚀🚀😀💓🥴💣👻🙌🙈🤢😥☹🌏💩🍎💕|0x0000000000004946c0e9F43F4Dee607b0eF1fA1c
|
|🚀🚀🚀🚀🚀🚀💸🎊💡🌿🚩🔥📌🙂💙❄🛰💩🤝⭐|0x000000000000c57CF0A1f923d44527e703F1ad70
|
|☀☀☀☀☀❤🌊🌖❌💀✔🌎🎈❌💞🛰💗😅❓☄|0x111111111117dC0aa78b770fA6A738034120C302
|
|👍🤫😋✊🤪😞🤐👶😭❤👉🚩💔🌱🤝🌊💚🪐🚩😐|0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
|
|😆🌎✅✨👋😜💛☺😶👋🐸🤩🌔🙌✋🤤⭐🍑☹⚡|0x2a0f713aA953442EacA9EA47083f656170e67BA4
|
|🔥🤬🌔😝😞🙄👌💢🗣🌍✨😙🐾😡😑🤘💸😂😤🔵|0x23B608675a2B2fB1890d3ABBd85c5775c51691d5
|
|🗣😅😞✨🤷😆🌟🐷🌷👶☝🪐🥀🖥🤟🐉💀💪😏❄|0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7
|
|🥴😆😰✌🤟🔥📣🎵🌖🌏😡🎶💙🐸🍒🌔😱🤘🍀➡|0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
|
|▶🌻😥👏💘😛💐💨❄💸😂😪😝🤤🐸💻😟☝🍃🥺|0xC18360217D8F7Ab5e7c516566761Ea12Ce7F9D72
|
参考实现
to_emoji = [
'🚀', '🪐', '☄', '🛰', '🌌', '🌑', '🌒', '🌓', '🌔', '🌕', '🌖', '🌗', '🌘', '🌍', '🌏', '🌎',
'🐉', '☀', '💻', '🖥', '💾', '💿', '😂', '❤', '😍', '🤣', '😊', '🙏', '💕', '😭', '😘', '👍',
'😅', '👏', '😁', '🔥', '🥰', '💔', '💖', '💙', '😢', '🤔', '😆', '🙄', '💪', '😉', '☺', '👌',
'🤗', '💜', '😔', '😎', '😇', '🌹', '🤦', '🎉', '💞', '✌', '✨', '🤷', '😱', '😌', '🌸', '🙌',
'😋', '💗', '💚', '😏', '💛', '🙂', '💓', '🤩', '😄', '😀', '🖤', '😃', '💯', '🙈', '👇', '🎶',
'😒', '🤭', '❣', '😜', '💋', '👀', '😪', '😑', '💥', '🙋', '😞', '😩', '😡', '🤪', '👊', '🥳',
'😥', '🤤', '👉', '💃', '😳', '✋', '😚', '😝', '😴', '🌟', '😬', '🙃', '🍀', '🌷', '😻', '😓',
'⭐', '✅', '🥺', '🌈', '😈', '🤘', '💦', '✔', '😣', '🏃', '💐', '☹', '🎊', '💘', '😠', '☝',
'😕', '🌺', '🎂', '🌻', '😐', '🖕', '💝', '🙊', '😹', '🗣', '💫', '💀', '👑', '🎵', '🤞', '😛',
'🔴', '😤', '🌼', '😫', '⚽', '🤙', '☕', '🏆', '🤫', '👈', '😮', '🙆', '🍻', '🍃', '🐶', '💁',
'😲', '🌿', '🧡', '🎁', '⚡', '🌞', '🎈', '❌', '✊', '👋', '😰', '🤨', '😶', '🤝', '🚶', '💰',
'🍓', '💢', '🤟', '🙁', '🚨', '💨', '🤬', '✈', '🎀', '🍺', '🤓', '😙', '💟', '🌱', '😖', '👶',
'🥴', '▶', '➡', '❓', '💎', '💸', '⬇', '😨', '🌚', '🦋', '😷', '🕺', '⚠', '🙅', '😟', '😵',
'👎', '🤲', '🤠', '🤧', '📌', '🔵', '💅', '🧐', '🐾', '🍒', '😗', '🤑', '🌊', '🤯', '🐷', '☎',
'💧', '😯', '💆', '👆', '🎤', '🙇', '🍑', '❄', '🌴', '💣', '🐸', '💌', '📍', '🥀', '🤢', '👅',
'💡', '💩', '👐', '📸', '👻', '🤐', '🤮', '🎼', '🥵', '🚩', '🍎', '🍊', '👼', '💍', '📣', '🥂'
]
from_emoji = {emoji: "{0:02x}".format(i) for i, emoji in enumerate(to_emoji)}
def encode_address(hexadecimal_address):
# 将十六进制地址编码为emoji
if len(hexadecimal_address) != 42 or not hexadecimal_address.startswith('0x'):
return None
return ''.join([to_emoji[int(hexadecimal_address[i:i+2], 16)] for i in range(2, 42, 2)])
def decode_address(emoji_address):
# 将emoji地址解码为十六进制
# In python, these unicode characters all have a len() of 1
if len(emoji_address) != 20:
return None
try:
return '0x' + ''.join(from_emoji[emoji] for emoji in emoji_address)
except IndexError:
return None
安全考虑
使用 base256emoji 编码,地址使用的字符数减少了一半。 使用的字符更容易区分。 这使生成相似地址的难度成倍增加,从而使地址欺骗变得不切实际。
版权
版权及相关权利通过 CC0 放弃。
Citation
Please cite this document as:
William Morriss (@wjmelements), "ERC-7673: 区分明显的 base256emoji 地址 [DRAFT]," Ethereum Improvement Proposals, no. 7673, April 2024. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7673.