在探索以太坊或其他基于以太坊生态的应用时,我们经常会接触到一长串由字母和数字组成的地址,0x742d35Cc6634C0532925a3b844Bc9e7595f8d5e8,细心的用户可能会注意到,在这串以 0x 开头的十六进制地址中,往往在中间位置附近会出现一个或多个特定的数字,比如上面例子中的 23,这个“以太坊中间的数字”并非随意生成,它是以太坊地址生成机制中的一个关键组成部分,其背后有着重要的校验作用。

要理解这个数字的含义,我们需要先简单了解一下以太坊地址是如何生成的。

  1. 从私钥到地址的旅程

    • 私钥:一切始于一个随机生成的私钥,它是一个非常大的随机数,本质上控制着你对以太坊账户中资产的所有权,私钥必须严格保密,一旦泄露,账户资金将面临被盗风险。
    • 公钥:通过椭圆曲线算法(具体是 secp256k1),可以从私钥推导出公钥,公钥与私钥是一一对应的,但无法从公钥反推出私钥。
    • 地址:以太坊地址并非直接使用公钥,而是通过对公钥进行一系列哈希运算得来的,具体步骤通常是:对公钥进行 Keccak-256 哈希运算,然后取哈希值的后 40 个字符(即 20 字节),并在前面加上 0x 前缀,形成我们看到的以太坊地址。
  2. 地址中的“校验位”——那个中间的数字: 现在我们来聚焦这个“中间的数字”,它并不是在地址生成过程的最后一步才“添加”上去的,而是整个地址哈希计算过程中自然产生的一部分,并且它扮演着至关重要的校验位(Checksum)角色。

    这个校验机制是由以太坊的创始人 Vitalik Buterin 提出的,旨在提高以太坊地址的可读性和安全性,防止用户因手动输入错误地址而导致资产损失,它被称为“地址校验和”(Address Checksum)

    校验和是如何工作的?

    • 我们对上面生成的 40 个字符的十六进制地址(不含 0x)进行大写化处理。
    • 我们计算这个地址字符串的 Keccak-256 哈希值。
    • 我们比较原始地址的每个字符(十六进制)和其对应哈希值的特定位,对于地址的第 随机配图