这是一个2016年1月14日,VitalikButerin,AlexVandeSande创建的提案。是为了防止在输入或者更改地址的情况下出现人为的输入错误,巧妙的利用十六进制数字的大小写进行了检验,以确定这是一个正确的转账地址,没有人为的输入错
这是一个 2016年1月14日,Vitalik Buterin,Alex Van de Sande创建的提案。是为了防止在输入或者更改地址的情况下出现人为的输入错误,巧妙的利用十六进制数字的大小写进行了检验,以确定这是一个正确的转账地址,没有人为的输入错误。由于ICAP(更多资料)方案一直开发缓慢,EIP-55得到了广泛的应用。
改变原始地址中用字母表示的数字的大小写来校验。
ETH地址 | |
---|---|
原始地址 | 0xf1299eb148b413be971822dff4fd079dab9d045d |
EIP-55 | 0xf1299EB148b413bE971822DfF4fD079dAB9d045d |
0xf1299eb148b413be971822dff4fd079dab9d045d
为例2bc188b1f661ad0cc363d2f4be284e96ecc3851590930eada61a200e8ae539a3
2bc188b1f661ad0cc363d2f4be284e96ecc38515
按照官方文档的描述转换规则
In English, convert the address to hex, but if the
i
th digit is a letter (ie. it’s one ofabcdef
) print it in uppercase if the4*i
th bit of the hash of the lowercase hexadecimal address is 1 otherwise print it in lowercase.
刚开始很懵逼,后来才明白其对照的是二进制的进行描述的。
0010101111000001100010001011000111110110011000011010110100001100110000110110001111010010111101001011111000101000010011101001011011101100110000111000010100010101100100001001001100001110101011011010011000011010001000000000111010001010111001010011100110100011
i
位置数字是用字母表示的,则检查相应的哈希值 4*i
位置的二进制是否为1。ETH地址 | |
---|---|
原始地址 | 0xf1299eb148b413be971822dff4fd079dab9d045d |
EIP-55 | 0xf1299EB148b413bE971822DfF4fD079dAB9d045d |
4*i
位置的数字是否为1其实就是检查原始地址的哈希值的十六进制的相应 i
位置的数字是否大于等于8。因为每4个二进制数表示一个十六进制数,如果4个二进制数开头位为1,那么这个数大于等于8。因此代码的实现一般也是通过和8的比大小来决定。
# 判断所给地址是否能够通过检验
import eth_utils
def decode(addr_str):
addr = eth_utils.to_bytes(hexstr=addr_str)
# 1.把地址全部恢复成小写
hex_addr = addr.hex()
checksummed_buffer = ""
# 2. 计算哈希值
hashed_address = eth_utils.keccak(text=hex_addr).hex()
# 计算正确的地址
for nibble_index, character in enumerate(hex_addr):
if character in "0123456789":
checksummed_buffer += character
elif character in "abcdef":
# 检查相应的数字是否大于8
hashed_address_nibble = int(hashed_address[nibble_index], 16)
if hashed_address_nibble > 7:
checksummed_buffer += character.upper()
else:
checksummed_buffer += character
else:
raise eth_utils.ValidationError(
f"Unrecognized hex character {character!r} at position {nibble_index}"
)
# 3.判断地址是否一致
return addr_str == "0x" + checksummed_buffer
# 地址字符串
if __name__ == '__main__':
##### 在此输入你的地址,更改任意一个数字或者字母大小写都无法通过校验
address = "0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"
##### 在此输入你的地址
if decode(address):
print("***",address,"***","合法地址")
else:
print("***",address,"***","非法地址")
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!