はじめに

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

今回は、EVM互換チェーンのアドレス識別をENSで統一するために、チェーンIDに特別なビットを加えて専用のコインタイプを自動生成する仕組みを提案しているENSIP11についてまとめていきます!

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

他にも様々なEIP・BIP・SLIP・CAIP・ENSIPについてまとめています。

概要

ENSIP11は、Ethereum Name Service(ENS)の仕様 ENSIP9(マルチチェーンアドレス解決) を拡張し、EVM互換チェーン専用のコインタイプ範囲を確保し、さらにEVMのChain IDをコインタイプに変換する方法を標準化するものです。

ENSIP9については以下の記事を参考にしてください。

具体的には、0x80000000(2147483648)以上の番号をEVMチェーン用に割り当て、将来的に非EVMチェーンのコインタイプと衝突しないように設計されています。 これにより、過去にEVMチェーンIDに割り当てられていた一部のコインタイプは非推奨となります。

動機

これまでのENSIP9は、SLIP44(暗号資産のコインタイプを管理する標準)に依存していました。SLIP-44は元々、ウォレットにおけるアドレスのエンコーディング方式を定義するために作られたものです。

SLIP44については以下の記事を参考にしてください。

しかし、EVM互換チェーンの多くはEthereumと同じエンコーディング方式を使っているため、わざわざSLIP44に新しいコインタイプを追加申請するのは冗長です。

そこでENSIP11では、Chain IDから直接コインタイプを導出できるルールを定めることで、追加申請の手間を省いて標準化と一貫性を実現します。

つまり、Ethereumと同じ仕組みを使うEVM互換チェーンは、Chain IDに基づいて自動的にコインタイプを決定する仕組みを作ることで、ENSのマルチチェーン対応を効率化しようとしています。

仕様

ENSIP11は、ENSIP9を拡張し、最上位ビット(MSB: Most Significant Bit)が1になっているコインタイプはEVMチェーンIDとして扱うことを定めています。 もともとSLIP44では、この最上位ビットの範囲はウォレットの鍵導出に関する用途のために予約されており、コインタイプとして割り当てられていません。 したがって、この範囲を利用しても他の既存コインタイプと衝突することはありません。

コインタイプの計算方法

EVMチェーン用の新しいコインタイプは、以下のようにチェーンIDと0x80000000をビットごとの論理和(OR演算)することで求められます。

javascript
export const convertEVMChainIdToCoinType = (chainId: number) =>{
  return  (0x80000000 | chainId) >>> 0
}

逆に、コインタイプから元のチェーンIDを求める場合は、0x7fffffffとのビットごとの論理積(AND演算)を使います。

javascript
export const convertCoinTypeToEVMChainId = (coinType: number) =>{
  return  (0x7fffffff & coinType) >> 0
}

実装について

この仕様に対応した実装は、ensdomains/address-encoder リポジトリで提供されています。 このライブラリを利用することで、変換処理やチェーン情報の取得を簡単に行うことができます。

使用例

次の例では、Ethereum Classic(Chain ID: 61)のコインタイプ変換を行っています。

javascript
const encoder = require('@ensdomains/address-encoder')

// Chain IDからコインタイプへ変換
encoder.convertEVMChainIdToCoinType(61)
// 出力: 2147483709

// コインタイプからChain IDへ変換
encoder.convertCoinTypeToEVMChainId(2147483709)
// 出力: 61

また、formatsByName や formatsByCoinType を使って、コインタイプから詳細なチェーン情報を取得することも可能です。

javascript
encoder.formatsByName['XDAI']
{
 coinType: 2147483748,
 decoder: [Function (anonymous)],
 encoder: [Function (anonymous)],
 name: 'XDAI'
}

encoder.formatsByCoinType[2147483748]
{
 coinType: 2147483748,
 decoder: [Function (anonymous)],
 encoder: [Function (anonymous)],
 name: 'XDAI'
}

例外チェーン

一部のチェーンは特殊な事情により、この標準から除外されます。 Avalancheは複数のアドレス形式を持ち、そのうちC-ChainのみがEVM互換ですが、他のチェーンも存在するため特例扱いとなります。 また、RSKは独自の追加検証を持つため、SLIP44に定義された従来のコインタイプを利用し続けます。

互換性

ENSIP11が導入される前に、すでにEVM互換チェーンとして定義されていたコインタイプも存在します。 例えば NRG、POA、CELO、ETC などです。 これらは従来のコインタイプを保持しつつ、区別のために _LEGACY を付けた名前で読み取り専用として扱うことが推奨されています。

これにより、新旧の規格が混在しても、既存の資産(トークン)の参照やENS上の名前解決に影響を与えず、安全に移行できる仕組みが提供されます。

最後に

今回は「EVM互換チェーンのアドレス識別をENSで統一するために、チェーンIDに特別なビットを加えて専用のコインタイプを自動生成する仕組みを提案しているENSIP11」についてまとめてきました! いかがだったでしょうか?

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

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