DEV Community

drake
drake

Posted on

EVM 小写地址转换为标准地址:(大小写混合)

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)
Enter fullscreen mode Exit fullscreen mode

Top comments (0)