はじめに

『DApps開発入門』という本や色々記事を書いているかるでねです。

今回は、Ethereumの各トークンに対して、トークンアドレスを使って一意のHDウォレットパスを割り当てることで、安全なトークン管理を可能にする仕組みを提案しているEIP85についてまとめていきます!

以下にまとめられているものを翻訳・要約・補足しながらまとめていきます。

他にも様々なEIPについてまとめています。

概要

Ethereumやそのトークンを扱うウォレットにおいて、アドレスの階層的な生成方法(HDウォレット)を標準化することは、ユーザーにとっての一貫性や相互運用性を確保する上で重要です。 EIP85では、EtherやEthereumトークンを対象にしたBIP44ベースのHDパスを提案しています。

BIP44とは

BIP44は、HD(Hierarchical Deterministic)ウォレットにおけるアドレス階層の標準を定めた提案です。 特定の形式に従ってアドレスを階層的に導出できるようにし、複数の通貨やアカウント、受け取り用/残高返却用アドレスなどを整理して管理できるようにすることを目的としています。

BIP44の標準的なパス形式は以下のとおりです。

text
m / purpose' / coin_type' / account' / change / address_index

ここでpurposeは常に44(BIP44準拠であることを示す)、coin_typeは通貨の種類(例:Bitcoinは0、Etherは60)、accountはアカウントの区別、changeは0(受け取り用)または1(残高返却用)、address_indexはインデックス番号です。

Ethereum用のHDパス

Ethereumにおいては、すでにBIP44に準拠したHDウォレットが普及しており、標準的なHDパスは以下のようになります。

text
m / 44' / 60' / a' / 0 / n

ここで60はEtherに割り当てられたcoin_type(SLIP44に登録済み)、aはアカウント番号、nはn番目に生成されるアドレスを意味します。

EthereumトークンのHDパスをどう扱うべきか

Ethereumには無数のERC20トークンが存在します。 Etherと同様に、それぞれのトークンに対して一意なHDパスを割り当てることができれば、トークンごとのアドレス管理が容易になります。

しかし、Etherのように各トークンごとにSLIP44で新しいcoin_type番号を登録していくことは現実的ではありません。 トークンの数が多すぎて、すべてを個別に登録するのは管理上困難です。

そこで、提案されているのが、Ethereumトークン用の共通coin_type番号として「61」を予約し、それをベースに各トークン固有のHDパスを構築するという方法です。

トークンアドレスをHDパスに変換する方法

各トークンは固有の160ビットアドレス(20バイト)を持っていますが、BIP32の階層的導出では、それぞれのレベルに使用できるのは最大31ビットの整数(2³¹未満)です。

そのため、この提案では160ビットのアドレスを次のように6つのセグメントに分割します:

text
x = x0 || x1 || x2 || x3 || x4 || x5
  • x0〜x4
    • 各28ビット
  • x5
    • 残りの20ビット

このように分割することで、各セグメントをBIP32のハードンドパス('付き)に利用可能な範囲に収めることができます。

トークンごとのHDパス構成

最終的なHDパスは以下のような形式になります。

text
m / 44' / 61' / x0' / x1' / x2' / x3' / x4' / x5' / a' / 0 / n

この形式により、coin_typeが61に固定されたうえで、トークンアドレスを使って一意のHDパスを作成できます。

これにより、トークンごとにまったく別のアドレス空間を持つことができ、セキュリティや管理の観点からも利点があります。

実例:Unicornトークン

例えば、Unicornトークンのコントラクトアドレスが以下だったとします。

text
0x89205A3A3b2A69De6Dbf7f01ED13B2108B2c43e7

これを上記のように分割・変換した場合、各セグメントは次のようになります。

text
x0 = 0x89205A3  = 143787427
x1 = 0xA3b2A69  = 171649641
x2 = 0xDe6Dbf7  = 233233399
x3 = 0xf01ED13  = 251784467
x4 = 0xB2108B2  = 186714290
x5 = 0xc43e7    = 803815

これらをHDパスに組み込むと、以下のような完全なパスになります。

text
m/44'/61'/143787427'/171649641'/233233399'/251784467'/186714290'/803815'/a'/0/n

メリットと課題

EIP85のメリットは、各トークンごとに明確かつ衝突のないHDパスを持つことができる点です。 これにより、トークンごとのアドレス管理が整理され、ウォレット間でのインポートや復元も容易になります。

一方、BIP44は本来、coin_typeに1つの整数しか許容しておらず、EIP85のようにトークンアドレスをcoin_typeの下層に階層的に組み込む構造は、BIP44の厳密な仕様から外れるとも言えます。 そのため、「非公式な拡張」として扱うのが妥当です。

最後に

今回は「Ethereumの各トークンに対して、トークンアドレスを使って一意のHDウォレットパスを割り当てることで、安全なトークン管理を可能にする仕組みを提案しているEIP85」についてまとめてきました! いかがだったでしょうか?

質問などがある方は以下のTwitterのDMなどからお気軽に質問してください!

他の媒体でも情報発信しているのでぜひ他も見ていってください!