[ERC681] ETHやERC20を送金できるURLの仕組みついて理解しよう！

# はじめに

初めまして。
**CryptoGames**というブロックチェーンゲーム企業でエンジニアをしている **cardene（かるでね）** です！
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームは**クリプトスペルズ**というブロックチェーンゲームです。

https://cryptospells.jp/

今回は、ETHや**ERC20**トークンを送るための、取引詳細を含んだURLの仕組みを提案している規格である**ERC681**についてまとめていきます！

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

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

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

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

# 概要

この方法は、主にイーサリアムネットワーク上での支払いリクエストに使われます。
このURL方式では、あなたがイーサリアムや**ERC20**トークンを送る時、その取引の詳細（送り先のアドレス、金額、トークンの種類など）を含むURLが作られます。
このURLを使えば、ウォレットアプリで簡単に取引ができます。

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

https://chaldene.net/erc20

例えば、**ERC20**トークンを他のアドレスに送りたい時は、そのトークンのスマートコントラクトの`transfer`関数を呼び出すURLが作られます。
このURLをウォレットアプリで開くだけで、簡単にトークンを送れます。

この方法の良い点は、取引がとてもシンプルで使いやすくなることです。
スマートコントラクトを使うことで、取引が自動的に処理され、安全かつ透明性の高い方法で行われます。
これは、オンラインバンキングやクレジットカードのURLベースのシステムと似ていますが、分散型で自動化されている点が異なります。

:::note info
イーサリアムや**ERC20**トークンの取引をURLで表すと、その取引がとても簡単で安全に行えるようになります。
:::

# 動機

このシステムでは、QRコードやウェブページのリンク、メールやチャットのメッセージに特別なURLが含まれています。
このURLを使うと、ユーザーのウォレットアプリがすぐに開きます。
ウェブベースのウォレットやスウォーム Đアプリも同様です。

たとえば、QRコードがある場合、それをスキャンするだけで、あなたのウォレットアプリが開き、支払いに必要な情報（送金先、金額、**ERC20**トークンの種類など）が自動的に設定されます。
あなたはこの情報を確認し、OKを出すだけで、取引が完了します。

この方法のいいところは、異なるアプリケーション間でスムーズにやり取りができることです。
例えば、ウェブページから直接ウォレットにアクセスできるので、支払いがとても簡単になります。
また、ユーザーが情報を一から入力する必要がないので、間違いのリスクが減ります。

さらに、このURL形式は、ユーザーが好きなウォレットアプリを使えるようにしています。
これにより、どんなユーザーも自分に合った方法で簡単に支払いができるようになります。
このシステムは、支払いプロセスをより効率的でユーザーフレンドリーにしています。

# 仕様

## 構文

イーサリアムの支払いリクエストURLは、「**ethereum**」というスキーマ（プロトコル部分）を含む特定の形式で作られています。
このURLは、次のような部分から成り立っています。

- **スキーマ接頭辞**
    - これは常に **"ethereum:"** で始まり、 **"pay-"** が付くこともあります。
- **目的のアドレス**
    - これはイーサリアムのアドレスです。
    - 通常は **"0x"** で始まる40文字の16進数、またはENS（イーサリアム名前サービス）の名前です。
- **チェーンID**（任意）
    - イーサリアムの異なるネットワーク（チェーン）を識別する数字です。
- **関数名**（任意）
    - スマートコントラクト内の特定の関数を指定する場合に使います。
- **パラメータ**（任意）
    - これはキーと値のペアで、取引の詳細を定義します。
    - 例えば、送金額（`value`）、ガス料金（`gas`）、ガスリミット（`gasLimit`）、ガス価格（`gasPrice`）などです。

パラメータの中で、**"value"**、**"gas"**、**"gasLimit"**、**"gasPrice"** というキーが使われる場合、値は数字でなければなりません。
それ以外のキーを使用する場合は、そのキーに対応するTYPE文字列に従って値を設定します。

例として、「**イーサリアムに10イーサを送る**」場合、URLは次のようになります。
```
ethereum:0x1234567890abcdef1234567890abcdef12345678?value=10
```
ここで、`0x1234567890abcdef1234567890abcdef12345678`は目的のアドレスで、`value=10`は送金額です。

このURL形式により、ユーザーは支払いを簡単に、そして正確に行うことができます。
また、スマートコントラクトの特定の関数を呼び出す場合も、URLを介して簡単に指定することが可能です。

## URLの詳細

イーサリアムの支払いリクエストURLの意味について説明します。

### 目的のアドレス（target_address）
これは必ず必要です。
イーサリアムの場合、ネイティブトークン（ether）の受け取り先を示すか、ユーザーがやり取りするコントラクトのアドレスを示します。

### チェーンID（chain_id）
これはオプションです。
様々なテストネットやプライベートネットワークを識別するための数字です。
もし指定されていなければ、ユーザーのウォレットが現在接続しているネットワークが使われます。

### 関数名（function_name）
これがなければ、URLはイーサリアムのネイティブトークン（**ether**）での支払いを要求しています。
支払う額は「**value**」パラメータで指定されます（例：**wei**）。
科学記数法を使うと便利です。
例えば、`2.014 ETH`を特定のアドレスに送る場合、以下のようになります。

```
ethereum:特定のアドレス?value=2.014e18
```

### ERC20トークンでの支払いの場合
トークンコントラクトの`transfer`関数を呼び出すようリクエストされます。
この関数には、受取人のアドレスとトークン量（**wei**）が含まれます。
例えば、特定のアドレスに1トークンを送る場合、以下のようになります。

```
ethereum:トークンコントラクトのアドレス/transfer?address=特定のアドレス&uint256=1
```

### ENS名の使用
16進数アドレスの代わりにENS名を使うこともできます。
16進数アドレスが常にENS名に優先されます。

### valueの指定
URLで指定された`value`はあくまで提案です。
ユーザーはこれを変更できます。
額が指定されていない場合、ユーザーに額を入力するよう促されるべきです。

### gasLimitとgasPrice
これらも提案された値ですが、ユーザーはこれを編集できます。
`gasLimit`は単に`gas`としても扱われます。

このように、イーサリアムの支払いリクエストURLは、トランザクションの詳細を柔軟に設定し、ユーザーに合わせてカスタマイズすることができます。
これにより、ユーザーは自分のニーズに合わせてトランザクションを簡単に調整できます。

# 補足

イーサリアムの支払いリクエストURL形式について説明します。

このURL形式は、ビットコインのURL形式に近いものにしようと考えられています。
これは、多くのユーザーやアプリ開発者がビットコインのURL形式に慣れているためです。
イーサリアムエコシステムでよく使われる単位（例えば**ether**）を省くことで、ビットコインと同様に金額を名目単位で表現できるようにしています。
イーサリアムや**ERC20**トークンの金額を表現する時には、科学記数法を使うことが推奨されています。
これは、読みやすさを考慮して、名目単位の10進数の値（例：イーサリアムでは`18`、**ERC20**トークンでは`decimals()`関数の戻り値）を指数として使用するためです。

さらに、16進数で指定されるイーサリアムアドレスの前には「`0x`」という接頭辞が付きます。これは、40文字の英数字から成るENS名との区別を明確にするための慣習に沿ったものです。

将来的にこの提案と一部または完全に互換性のないアップグレードが行われる場合、それらは「**pay-**」以外の接頭辞を使用し、その接頭辞はダッシュ（**-**）で区切られることになります。

このように、イーサリアムの支払いリクエストURL形式は、既存のビットコインのURL形式に似せることでユーザーの使いやすさを考慮して設計されており、金額の表現方法やアドレスの表記方法にも特定のルールがあります。
これにより、イーサリアムの支払い処理がよりシンプルで直感的になることが期待されています。

# 後方互換性

イーサリアムの支払いリクエストにおいて、もっとも一般的な状況は、送金先ユーザーのアドレスのみを指定するケースです。
この場合、新しい仕様は、過去に使われていた**ERC67**と互換性があります。

この互換性により、イーサリアムの支払いリクエストを行う時に、新旧の仕様を気にせずによりシンプルかつ効率的に行うことが可能になります。

# セキュリティ考慮事項

イーサリアムの支払いリクエストURLからの取引は、一度開始されると取り消すことができません。
そのため、これらのURLの正確性と本物であることが非常に重要です。
攻撃者が受取人のアドレスや送金額を変更することは、攻撃に利用される可能性があります。
そのため、ユーザーは信頼できるソースからのみURLを受け取り、使用するべきです。

不正なリダイレクトを防ぐため、イーサリアムアドレスの16進数表記は、ENS（イーサリアム名前サービス）よりも優先されるべきです。
クライアントソフトウェアは、ENSアドレスが16進数アドレスに似ている場合にはユーザーに警告し、フィッシング攻撃の可能性がある場合にはそのアドレスを拒否することもできます。

また、取引される金額が意図したものであることを確かめるために、ユーザーが金額を簡単に確認できるようにすることが重要です。
**ERC20**トークンでの支払いでは、支払いを行うクライアントがトークンコントラクトの情報にアクセスできる場合、そのコントラクトで定められた単位で金額を表示すべきです。
それができない場合は、URLに記載された通りに表示し、単位の不確実性についてユーザーに警告することが望ましいです。
金額をユーザーが確認しやすいように、科学記数法を使って、例えばイーサリアムの場合は`18`といったトークンの名目単位に対応する指数を使用することが推奨されます。

# 引用

Daniel A. Nagy (@nagydani), "ERC-681: URL Format for Transaction Requests," Ethereum Improvement Proposals, no. 681, August 2017. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-681.

# 最後に

今回は「ETHや**ERC20**トークンを送るための、取引詳細を含んだURLの仕組みを提案している規格である**ERC681**」についてまとめてきました！
いかがだったでしょうか？

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

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

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

https://chaldene.net/

https://zenn.dev/heku

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58


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