Alert Source Discuss
⚠️ Draft Standards Track: ERC

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.