以太坊钱包地址为什么是大小写混杂?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TurkeyCock/article/details/84076411

不知道大家有没有注意到,不管是ImToken/Metamask还是交易所,钱包地址都是大小写混杂的:
在这里插入图片描述
但是如果你在etherscan上查交易信息,所有地址都是小写字母。这两者有什么区别呢?其中暗藏着什么玄机?

在以太坊上,钱包地址就是你资产的唯一标识。但是,钱包地址长度为20个字节,40个字符,基本没人记得住,而且很容易输错。假如你要转一些以太给一个朋友,他把他的钱包地址发给你,但是一不小心把其中一个字符写错了,会发生什么?你的以太可能会转入一个“以太坊黑洞”,也就是一个没人拥有私钥的地址,再也取不出来了。。。

比特币上不会有这个问题,因为比特币地址中包含有“校验和”信息。为了弥补这一缺陷,以太坊出台了EIP55,用于验证以太坊地址的有效性。具体过程是这样的:

  • 首先把地址中的所有字母变成小写,然后计算地址的哈希值v
  • 然后依次扫描地址中的每个字符,如果是数字则原样输出,如果是字母,则判断v中第4*i位的值,如果是1则输出大写字母,否则输出小写字母(i是该字母在地址中的位置)
  • 最后验证原始地址和输出的地址是否完全一致,不一致则该地址可能是一个非法地址

对应代码如下:

from ethereum import utils

def checksum_encode(addr): # Takes a 20-byte binary address as input
    o = ''
    v = utils.big_endian_to_int(utils.sha3(addr.hex()))
    for i, c in enumerate(addr.hex()):
        if c in '0123456789':
            o += c
        else:
            o += c.upper() if (v & (2**(255 - 4*i))) else c.lower()
    return '0x'+o

def test(addrstr):
    assert(addrstr == checksum_encode(bytes.fromhex(addrstr[2:])))

test('0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed')
test('0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359')
test('0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB')
test('0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb')

注:上面代码中先通过bytes.fromhex()把字符转换为16进制数,然后再通过hex()转换回来,这样得到的就是全小写字母的地址。

据官网披露,各种主流钱包都已经应用了这项技术:(包括ImToken)
在这里插入图片描述
各大主流交易所也已经增加了支持:
在这里插入图片描述

参考:

https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md

更多文章欢迎关注“鑫鑫点灯”专栏:https://blog.csdn.net/turkeycock
或关注飞久微信公众号:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/TurkeyCock/article/details/84076411
今日推荐