美文网首页
ERC55 以太坊地址大小写的问题与checksum

ERC55 以太坊地址大小写的问题与checksum

作者: 梁帆 | 来源:发表于2022-11-24 18:35 被阅读0次

https://eips.ethereum.org/EIPS/eip-55

首先我们知道,在做区块链的项目的时候,很容易被以太坊地址大小写的问题所困扰,尤其是在前端获取链上数据的时候,在做地址比对的时候,都会先用toLowercase()转化成小写才进行比对。因为以太坊本身的地址是不区分大小写的,严格上来讲,你可以往以太坊存储随便大小写的以太坊地址。

一、地址大小写验证

我们来写一个简单的合约验证下:

// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;

contract Checksum {
    address addr;

    function setAddr(address _addr) external {
        addr = _addr;
    }
}

这个合约的功能就是设置一个地址,输入的就是一个address类型的参数。这里我用的地址是:

0x13a6D1fe418de7e5B03Fb4a15352DfeA3249eAA4

Remix成功执行:

执行成功 我们再把上面地址倒数第一个出现的A改成a,就是:
0x13a6D1fe418de7e5B03Fb4a15352DfeA3249eAa4

此时再执行,Remix会报错!

transact to Checksum.setAddr errored: Error encoding arguments: Error: bad address checksum (argument="address", value="0x13a6D1fe418de7e5B03Fb4a15352DfeA3249eAa4", code=INVALID_ARGUMENT, version=address/5.5.0) (argument=null, value="0x13a6D1fe418de7e5B03Fb4a15352DfeA3249eAa4", code=INVALID_ARGUMENT, version=abi/5.5.0)

它告诉我们这个被我们修改后的地址checksum有问题,所以没通过。

二、ERC55混合大小写校验

ERC55用了一个校验机制来对大小写进行了规定,具体的机制就是经过一系列运算,决定地址中的哪些字母是大写的,哪些字母是小写的,只要有一个不对,就没法校验通过。

用js实现这个算法如下:

const createKeccakHash = require('keccak')

function toChecksumAddress (address) {
  address = address.toLowerCase().replace('0x', '')
  const hash = createKeccakHash('keccak256').update(address).digest('hex')
  let ret = '0x'

  for (let i = 0; i < address.length; i++) {
    if (parseInt(hash[i], 16) >= 8) {
      ret += address[i].toUpperCase()
    } else {
      ret += address[i]
    }
  }

  return ret
}

我们对上面的修改过的地址进行下验证:

> toChecksumAddress('0x13a6D1fe418de7e5B03Fb4a15352DfeA3249eAa4')
'0x13a6D1fe418de7e5B03Fb4a15352DfeA3249eAA4'

会发现成功返回了我们未修改前的字母大小写状态。

这个标准对于前端或者进行链上数据处理的时候,还是非常有用的,可以省去很多麻烦。所以不管是remix还是前端的库,都集成了checksum的功能,如果输入的参数不是符合ERC55标准的话,是会报错的。

相关文章

网友评论

      本文标题:ERC55 以太坊地址大小写的问题与checksum

      本文链接:https://www.haomeiwen.com/subject/kztoxdtx.html