# [ERC7950] 複数チェーン上のトランザクションを一意に特定する文字列形式の仕組みを理解しよう！

> ERC7950では、「チェーンID」と「トランザクションハッシュ（取引ハッシュ）」を1つの文字列としてまとめて表現する方法を提案しています。

- URL: https://cardene.dev/articles/44c124dd548c2eef4ab7
- 公開日: 2025-10-21
- 更新日: 2025-10-21
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

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

https://amzn.asia/d/gxvJ0Pw

今回は、ブロックチェーン上のトランザクションを、どのチェーンのトランザクションなのかを1つの文字列で表現できるようにする仕組みを提案している**ERC7950**についてまとめていきます！

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

https://eips.ethereum.org/EIPS/eip-7950

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

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4

## 概要

**ERC7950**では、「**チェーンID**」と「**トランザクションハッシュ（取引ハッシュ）**」を1つの文字列としてまとめて表現する方法を提案しています。
通常、ブロックチェーン上のトランザクションは、そのハッシュ値（トランザクションの一意な識別子）によって参照されます。
しかし、同じトランザクションハッシュが異なるチェーン上で存在する可能性があり、単にハッシュだけではどのチェーンに属する取引なのか判断できません。
この問題を解決するために、チェーンID（どのブロックチェーンかを示す識別子）とトランザクションハッシュを1つの文字列にまとめて符号化（エンコード）する方法を定めます。
これにより、1つの文字列だけでトランザクションとチェーンの両方を明確に指定できるようになります。

## 動機

トランザクションハッシュをもとに特定のトランザクションを検索するとき、必ず「**どのチェーンのトランザクションか**」という文脈が必要になります。
例えば、同じハッシュ値のトランザクションがEthereumとPolygonの両方に存在する可能性があります。
このとき、ハッシュだけではどちらのチェーンを参照しているのかが分かりません。

この課題を解決するために、トランザクションハッシュ自体にチェーン情報を含めるという発想が提案されています。
これによって、1つの文字列を見るだけでどのチェーン上のトランザクションなのかが即座に分かるようになります。
例えば、ユーザーがこの統合文字列をクリックしたときに、自動的に該当するチェーンのブロックチェーンエクスプローラー（取引を閲覧できるサイト）へ転送するフォワーダーサービスなどに応用できます。

なお、ブロックチェーン内部の「**トランザクションオブジェクト**」にはすでにチェーンIDが含まれていますが、そのオブジェクトには今回の目的に不要な多くのデータが含まれており効率的ではありません。
したがって、必要最小限の情報（チェーンIDとトランザクションハッシュ）だけを1つにまとめた文字列形式を定めることが重要です。

## 仕様

**ERC7950**で定義されるエンコード文字列（encoded string）は、3つの要素から構成されます。
それぞれの要素を組み合わせることで、1つのトランザクションを一意に識別できる文字列を作り出します。

| 要素名  | 説明  |
| ------ | ------ |
| `chainId` | チェーンID。**EIP155**に基づいて定義されたIDを使用します。**EIP155**で示されている「**チェーンIDリポジトリ**」に登録されている値でなければなりません。 |
| `txHash`  | トランザクションハッシュ。必ず `0x` プレフィックス（接頭辞）を含める必要があります。これは、ハッシュ値が16進数で表現されていることを明示するためのものです。   |
| `tx`  | 固定の文字列 `tx`。この文字列は「**これはトランザクションを示すものである**」という型識別子（タイプ・アイデンティファイア）として使われます。  |

:::message
**EIP155**については以下の記事を参考にしてください。
:::

[\[EIP155\] Ethereumネットワークでリプレイ攻撃を防ぐ仕組みを理解しよう！](/articles/2526432899353e4a0225)

#### 構文

エンコードされた文字列は、以下の構文に従って組み立てます。

```
chainId:txHash:tx
```

各要素の間はコロン（`:`）で区切ります。
つまり、**チェーンID → トランザクションハッシュ → 型識別子**の順に並びます。

#### 例

具体的な例として、以下のようなトランザクションを考えます。

* チェーンID: `1`（Ethereum Mainnet を示す ID）
* トランザクションハッシュ: `0xc55e2b90168af6972193c1f86fa4d7d7b31a29c156665d15b9cd48618b5177ef`

この場合、規格に従ったエンコード文字列は次のようになります。

```
1:0xc55e2b90168af6972193c1f86fa4d7d7b31a29c156665d15b9cd48618b5177ef:tx
```

どのチェーンのどのトランザクションを示しているのかが明確になります。
この形式を使うことで、ツールやサービスが自動的に対象のチェーンとトランザクションを認識できます。

#### 大文字・小文字の扱い

すべての文字は大文字・小文字を区別しません（case-insensitive）。
つまり、以下の2つの表記は同じ意味を持ちます。

```
1:0xc55e2b90168af6972193c1f86fa4d7d7b31a29c156665d15b9cd48618b5177ef:tx
```

```
1:0XC55E2B90168AF6972193C1F86FA4D7D7B31A29C156665D15B9CD48618B5177EF:TX
```

このルールにより、大文字・小文字の違いによる解釈のずれを防ぎ、実装や表示の一貫性を保つことができます。

## 補足

**ERC7950**で定められているフォーマットにおいて、最初に「**チェーンID（chain ID）**」を配置しているのは、クエリ（問い合わせ）を正しく振り分けるうえで最も重要な情報がチェーンIDであるためです。
チェーンIDは、どのブロックチェーン上のトランザクションであるかを特定するための基本情報です。
複数のチェーンを扱うシステムでは、まずチェーンを特定しないと次の処理（トランザクションの検索や検証など）を進めることができません。
そのため、エンコード文字列の最初にチェーンIDを配置することで、解析やルーティング（適切な処理先への振り分け）を効率的に行えるようにしています。

次に配置されているのが「**トランザクションハッシュ（transaction hash）**」です。
これは、チェーン内で特定のトランザクションを識別するための2番目に重要な要素です。
トランザクションハッシュはそのチェーン内で一意であるため、チェーンIDと組み合わせることで完全にユニークな識別子になります。

また、文字列の末尾に付与されている固定の文字列 `tx` は、その文字列が「**トランザクション**」を表していることを明示する役割を持っています。
これがない場合、同じような構造を持つ他の文字列（例えばアドレスやブロック番号など）との区別がつきにくくなります。
つまり、`tx` は一種の「型識別子（type identifier）」として機能しており、

* `tx`
    トランザクションを表す
* `addr`
    アドレスを表す（このような拡張が将来的に導入される可能性もある）

上記のような区別が可能になります。

例えば、以下のような文字列を考えたときに、このままでは「**アドレスなのか**」、「**トランザクションなのか**」、「**その他のデータなのか**」が分かりません。

```
1:0xc55e2b90168af6972193c1f86fa4d7d7b31a29c156665d15b9cd48618b5177ef
```

しかし、`tx` を末尾に付けることで、以下のように明確に区別できるようになります。

```
1:0xc55e2b90168af6972193c1f86fa4d7d7b31a29c156665d15b9cd48618b5177ef:tx
```

このように、`tx` の追加はシステム間での誤認を防ぎ、可読性と安全性を高める設計上の工夫となっています。

## セキュリティ

**ERC7950**は、直接的なセキュリティリスクを新たに導入するものではありません。
このエンコード方式は、あくまで「**データの表現方法**」を定義するものであり、暗号化や署名、アクセス制御といったセキュリティ機構を扱うものではないためです。

セキュリティに関する判断や実装方法は外部のサービス提供者に委ねられます。
例えば、ウォレット開発者やブロックチェーンエクスプローラーの運営者が、この規格を採用するかどうか、また採用する場合にどのように処理を行うかを決定します。
その時、それぞれのサービスが独自にセキュリティ対策を設計・実装する必要があります。

言い換えると、**ERC7950**自体は安全性を損なう要素を含まない一方で、安全性を保証するものでもありません。
この標準は「**識別子をわかりやすく統一する仕組み**」を提供するだけであり、その利用環境でのセキュリティ確保は各実装側の責任となります。

## 引用

Lauri Peltonen (@microbecode), "ERC-7950: Encode chain id with transaction hash," Ethereum Improvement Proposals, no. 7950, May 2025. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-7950.

## 最後に

今回は「ブロックチェーン上のトランザクションを、どのチェーンのトランザクションなのかを1つの文字列で表現できるようにする仕組みを提案している**ERC7950**」についてまとめてきました！
いかがだったでしょうか？

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

[Twitter @cardene777](https://twitter.com/cardene777)

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

https://chaldene.net/

https://zenn.dev/heku

https://cardene.substack.com/

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

https://cardene.notion.site/ERC-EIP-2a03fa3ea33d43baa9ed82288f98d4a9?pvs=4
