主页 > imtoken官方下载2.0 > 【知识】以太坊地址区分大小写吗?
【知识】以太坊地址区分大小写吗?
imtoken官方下载2.0 2023-11-17 05:11:58
以太坊地址是否区分大小写? 为了弄清楚这个问题,我们不妨先在私有链上做个实验:
geth> eth.sendTransaction({
from: eth.accounts[0],
to: "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
value: web3.toWei(1, 'ether')
})
geth> eth.sendTransaction({
from: eth.accounts[0],
to: "0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
value: web3.toWei(1, 'ether')
})
geth> eth.getBalance("0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
geth> eth.getBalance("0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
复制
从实验结果来看,纯小写地址和纯大写地址其实是同一个地址,那么是否可以断定以太坊地址是不区分大小写的呢? 让我们看看下面的混音实验:
pragma solidity ^0.5.0;
contract Foo {
address bar = 0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa;
}
复制
代码运行结果如下图所示:
混音
结果提示错误,并给出了大小写混合的正确地址:
这看起来像一个地址以太坊地址查询,但校验和无效。 正确的校验和地址:“0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa”。 如果这不用作地址,请在前面加上“00”。 有关更多信息#adds,请 lieter
发生了什么? 其实这是因为EIP-55规范引入了校验和机制。 它是做什么用的? 想象一下,如果你在输入一个很长的以太坊地址时不小心输入了错误的字符,那么这样的错误将很难被发现。 通过校验和机制,我们可以在业务程序中验证地址的准确性,从而降低用户输入错误地址的风险以太坊地址查询,给出golang代码示例:
package main
import (
"flag"
"fmt"
"github.com/ethereum/go-ethereum/common"
)
var (
address = flag.String("address", "", "address")
)
func init() {
flag.Parse()
}
func main() {
addressWithChecksum := common.HexToAddress(*address).Hex()
if addressWithChecksum != *address {
fmt.Println(" valid: " + addressWithChecksum)
fmt.Println("invalid: " + *address)
} else {
fmt.Println("This address is valid.")
}
}
复制
代码运行结果如下图所示:
图片
校验和
如果你没有Golang运行环境,其实还有一个更简单的验证方法:使用Etherscan获取带有校验和的地址,注意地址栏中的地址和下面Address旁边的地址:
图片
以太扫描
总结:以太坊地址本身是不区分大小写的,但是出于安全考虑,我们应该尽可能使用符合EIP-55规范的地址。 当然,业务程序必须有相应的校验和校验逻辑。