Ethereumのアドレスの英字は大小混ざっている
Metamaskでアドレスをコピーすると、以下のように、アルファベットに関しては大小入り混じっています。(16進数なので、0~fまでの値になっている) なんで大文字と小文字のアルファベットがあるんや。
0xa276914129adBC1aF2E59d520aF1EbBd842DC676
(send me money)
アドレスの導出過程を考えると、アルファベットの大小を区別しているとは考えられません。
調べていくうちに、Ethereum独自のチェックサムによるものだということに辿り着きました。
Ethereumのチェックサムの前に、まずはBitcoinのアドレスのチェックサムについて見ていきましょう。
Bitcoinのアドレスのチェックサム
Bitcoinのアドレスの導出方法はEthereumのそれとは異なります。
特に、public keyにsha-256を2回適用したものの最初の4bytesをチェックサムとして、アドレスの最後にくっつける点は特徴的です。チェックサムにより、アドレスの写し間違いなどのミスを防げます。
ではEthereumではどのようにチェックサムを導入しているのでしょうか。
Ethereumのアドレスのチェックサム
元来、Ethereumのアドレスにはチェックサムはありません。これは、「イーサリアムのアドレスは最終的にシステムの上位レイヤーによって抽象化(ネームサービスなど)されることで隠され、必要に応じて上位レイヤーにチェックサムが追加されると考えられていたことが背景に挙げられます。」(『マスタリング・イーサリアム』より) しかし、上位レイヤーの開発は遅く、アドレスのミスタイプ等の問題が発生したそうです。そこで提案されたのが、チェックサム付きエンコーディングEIP-55です。
EIP-55ではアドレスの一部を大文字にすることで、チェックサムを提供しています。イーサリアムのアドレスは大文字と小文字の区別をしないという性質を利用して、従来の小文字のみのアドレスとの互換性を保っています。
EIP-55によるエンコーディングの具体的な中身を見ていきましょう。
まず、小文字のみの従来のアドレスのKeccak-256ハッシュ値を求めます。アドレスとハッシュ値を並べて、ハッシュ値が0x8以上の場合は各アルファベットを大文字にします。実際に私のアドレスで試してみましょう。
0xa276914129adbc1af2e59d520af1ebbd842dc676 (アドレス)
0x785c27926c64a9d3c0aa1327e2c3f5d54179c46079a51807571e4d8d2eb80532 (ハッシュ値)
例えば、13桁目のdに対応するハッシュ値はaなので、dは大文字になります。
結果として以下が得られます。
0xa276914129adBC1aF2E59d520aF1EbBd842DC676
確かに私のアドレスと一致します。
もし、アドレスの入力をミスしてしまった場合は、ハッシュ値が大きく異なる値になるためEIP-55エンコーティングの結果と違うものになってしまい、ミスに気づくということです。
EIP-55エンコーディングにより、99.975%の精度でエラーを検出できるようです。(なお、Bitcoinのチェックサムの精度には及びません)
おわり
Ethereumのアドレスの謎が解けてスッキリしました。
EIPは面白そうな内容ばかりなので、今後も追っていこうと思います。
ご精読ありがとうございました。
引用
- How to create an Ethereum wallet address from a private key (https://www.freecodecamp.org/news/how-to-create-an-ethereum-wallet-address-from-a-private-key-ae72b0eee27b/)
- How to create a Bitcoin wallet address from a private key (https://www.freecodecamp.org/news/how-to-create-a-bitcoin-wallet-address-from-a-private-key-eca3ddd9c05f/)
- EIP-55: Mixed-case checksum address encoding (https://eips.ethereum.org/EIPS/eip-55)
- 『マスタリング・イーサリアム』(Andreas M. Antonopoulus 2019)
最近のコメント