from eth_utils import keccak, to_checksum_address
def explain_checksum_address(address):
"""
展示 EIP-55 校验和地址的生成过程
"""
# 移除 0x 前缀,转换为小写
address_lower = address.lower().replace('0x', '')
print(f"1. 原始地址(小写): {address_lower}\n")
# 对小写地址进行 Keccak-256 哈希
hash_bytes = keccak(text=address_lower)
hash_hex = hash_bytes.hex()
print(f"2. 地址的Keccak-256哈希: {hash_hex}\n")
# 根据哈希值决定每个字符的大小写
checksum_address = '0x'
print("3. 大小写转换规则:")
for i, char in enumerate(address_lower):
if char in '0123456789':
# 数字保持不变
checksum_address += char
print(f" 位置{i}: '{char}' -> '{char}' (数字)")
else:
# 字母:哈希对应位置的值 >= 8 则大写,否则小写
hash_digit = int(hash_hex[i], 16)
if hash_digit >= 8:
checksum_address += char.upper()
print(f" 位置{i}: '{char}' -> '{char.upper()}' (哈希值{hash_digit} >= 8)")
else:
checksum_address += char
print(f" 位置{i}: '{char}' -> '{char}' (哈希值{hash_digit} < 8)")
print(f"\n4. 最终校验和地址: {checksum_address}")
return checksum_address
# 示例
address = "0x5aaeb6053f3e94c9b9a09f33669435e7ef1beaed"
result = explain_checksum_address(address)
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)