# [ERC2266] 第三者なしで直接トークンを交換するアトミックスワップの仕組みを理解しよう！

> この標準は、トークンコントラクトがアメリカンコールオプションという特定の種類のオプション取引を行えるようにするためのものです。アメリカンコールオプションとは、購入者が特定の期間内にある価格で資産を購入する権利を持つことを意味します。

- URL: https://cardene.dev/articles/4e263429568fac8c8d5c
- 公開日: 2024-01-02
- 更新日: 2024-01-02
- トピック: Blockchain
- タグ: ethereum, solidity, smartcontract, ブロックチェーン

## はじめに

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

https://cryptogames.co.jp/

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

https://cryptospells.jp/

今回は、第三者を介さずにトークンを直接交換できる、アトミックスワップの仕組みを提案している規格である**ERC2266**についてまとめていきます！

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

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

:::message alert
**2266**は現在（2023年12月30日）では「**Last Call**」段階です。
:::

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

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

## 概要

この標準は、トークンコントラクトがアメリカンコールオプションという特定の種類のオプション取引を行えるようにするためのものです。
アメリカンコールオプションとは、購入者が特定の期間内にある価格で資産を購入する権利を持つことを意味します。
この取引を安全かつ信頼性が高く行うために、アトミックスワップという技術を使用します。
アトミックスワップは、特定の条件が満たされた時にのみ取引が完了するようなコントラクトです。

:::message
#### アトミックスワップ
アトミックスワップは、異なるブロックチェーン上の暗号通貨を信頼できる第三者や中央機関を介さずに直接交換する技術です。
このプロセスは「**アトミック**」と呼ばれるのは、取引が完全に実行されるか、あるいは全く実行されないかのどちらかであるためです。
つまり、取引は中途半端な状態で終わることがありません。

##### アトミックスワップの主要な特徴とメカニズム

- **ブロックチェーン間の交換**
    - アトミックスワップは異なるブロックチェーン間でのトークン交換を可能にします。
    - 例えば、ビットコインをイーサリアムに、またはその逆に交換できます。

- **信頼性の確保**
    - アトミックスワップは、ユーザーがお互いを信頼する必要がないように設計されています。
    - 取引はスマートコントラクトや特定のプロトコルによって管理され、条件が満たされなければ取引は完了しません。

- **ハッシュタイムロックコントラクト（HTLC）**
    - この技術は一般に、**HTLC**に基づいて実行されます。
    - **HTLC**は、取引を行う両当事者が条件を満たすまでトークンを一時的にロックする仕組みです。
    - 条件とは、通常、特定の暗号的ハッシュを解くことで、これにより取引が保証されます。

- **時間制限**
    - **HTLC**には時間制限が設定されており、一定時間内に取引が完了しなければ、トークンは元の所有者に戻ります。
    - これにより、資産が無期限にロックされるのを防ぎます。

##### アトミックスワップのプロセス

1. **取引の開始**
    - 一方の当事者が**HTLC**を作成し、特定のハッシュでトークンをロックします。
2. **取引の受け入れ**
    - もう一方の当事者は、同じハッシュを使用して自分のトークンをロックする**HTLC**を作成します。
3. **秘密の公開**
    3. 最初の当事者が秘密を公開し、これにより自分のトークンを解放します。
    3. 同時に、この秘密は他の当事者が彼らのトークンを解放するのにも使われます。
4. **取引の完了**
    4. 両当事者がそれぞれのトークンを受け取り、**HTLC**が解除されます。

##### アトミックスワップの利点

- **分散化**
    - 中央機関が不要で、ユーザー間で直接トークンが交換されるため、よりセキュリティが高くなります。
- **低コスト**
    - 伝統的な交換方法に比べて、手数料が少なく済むことが多いです。
- **相互運用性**
    - 異なるブロックチェーン間での流動性と相互運用性を提供します。

アトミックスワップは、その安全性と効率性により、デジタル資産交換の未来として注目されています。
しかし、実装の複雑さや全てのブロックチェーンがサポートされているわけではないなど、いくつかの課題もあります。
それにもかかわらず、この技術は、より分散化された金融システムへの道を切り開いています。
:::

:::message
#### アメリカンコールオプション
アメリカンコールオプションは、特定の金融商品（通常は株式）を事前に定められた価格（行使価格）で、オプションの有効期限内の任意の時点で購入する権利を与える契約です。
これは「**コールオプション**」の一種で、主に株式市場で取引されますが、他の資産に対しても使用されることがあります。

##### アメリカンコールオプションの主な特徴

- **購入権利**
    - コールオプションを持つ投資家は、特定の資産をあらかじめ定められた価格で購入する権利を持ちますが、それを行使する義務はありません。

- **行使期間**
    - アメリカンスタイルのオプションは、期限までの任意の時点で行使することができます。
    - これは、ヨーロピアンコールオプション（期限の日にのみ行使可能）とは異なります。
- **プレミアム**
    - オプションを購入するためには、プレミアムと呼ばれる料金を支払う必要があります。
    - このプレミアムは、オプションの価値に依存し、多くの要因によって決まります（例：資産の現在価格、行使価格、残りの有効期間、市場の変動性など）。

##### アメリカンコールオプションの利点

- **柔軟性**
    - 有効期限内の任意の時点でオプションを行使できるため、市場の動きに応じて戦略を変更する柔軟性があります。
- **潜在的利益**
    - 株価が行使価格よりも高くなると、オプションを行使して差額を利益として得ることができます。
- **リスク管理**
    - 投資家は、購入した資産の価格が下落しても、最大損失がプレミアムに限定されるため、リスクを管理しやすくなります。

##### 使用シナリオ

- **投機**
    - 投資家は、資産価格の上昇を予測してコールオプションを購入し、価格が実際に上昇すれば利益を得ることができます。
- **ヘッジング**
    - 既に保有している資産の価格下落リスクを軽減するためにオプションを使用することができます。

##### 注意点

- **時間の価値の減少**
    - 有効期限が近づくにつれて、オプションの時間価値は減少し、それによりオプションの価値も減少する可能性があります。
- **市場変動性**
    - 株価の急激な変動はオプションの価値に大きな影響を与えるため、市場の変動性を常に監視する必要があります。

アメリカンコールオプションは、その柔軟性とリスク管理の特性により、多くの投資家にとって魅力的な選択肢です。
しかし、これらのオプションを取引する前に、その仕組みとリスクを十分に理解しておくことが重要です。
:::

具体的には、ハッシュタイムロックコントラクト（**HTLC**）と呼ばれる技術が用いられます。
これは、一定の時間が経過するか特定の秘密の情報が提供されるまで資産をロックする仕組みです。
この仕組みにより、取引の片方が約束を守らない場合でも、他方が損害を受けることがありません。
つまり、信頼できる第三者を必要とせずに安全な取引が可能になります。

:::message
#### HTLC

ハッシュタイムロックコントラクト（**HTLC**）は、ブロックチェーン技術を利用した特定の種類のスマートコントラクトです。
このコントラクトは主に、二者間での信頼性の高い取引を可能にするために設計されています。
ここで「**信頼性**」とは、取引が公正かつ透明に行われ、参加者が約束を破った場合には取引が無効になることを意味します。

##### HTLCの主な特徴

- **ハッシュロック**
    - 取引を行う二者は、特定の「**秘密**」（乱数として生成）のハッシュを使用してコントラクトをロックします。
    - 取引を完了するためには、正しい秘密が提供されなければなりません。
    - この秘密を知っているのは、取引を開始する人だけです。
    - 取引を受ける側は、この秘密を知ることによって初めて資産を受け取ることができます。

- **タイムロック**
    - コントラクトには有効期限が設定されています。
    - 特定の期間内に取引が完了しない場合、資産は元の所有者に返却されます。
    - これにより、資産が無期限にロックされることを防ぎます。

##### HTLCの利点

- **信頼性**
    - 取引の両方の当事者は、約束された条件が満たされなければ資産が移動しないことを知っているため、お互いを信頼する必要がありません。
- **分散化**
    - 中央集権的な仲介者が不要で、取引はブロックチェーン上で直接行われます。
- **原子性**
    - 取引は「**全てまたは無し**」の方式で行われます。
    - つまり、取引が完全に成功するか、完全に失敗するかのどちらかです。中途半端な状態で終わることはありません。

##### HTLCの使用例

- **アトミックスワップ**
    - 異なるブロックチェーン間での暗号通貨の交換。たとえば、ビットコインとイーサリアムを直接交換することができます。

- **支払いの条件付き実行**
    - 商品やサービスの提供が条件として設定され、その条件が満たされた時のみ支払いが実行されます。

**HTLC**は、ブロックチェーンのスマートコントラクトを利用した高度な金融取引やサービス提供の方法を提供します。
ただし、この技術を適切に利用するためには、関連するリスクや技術的な側面を十分に理解することが重要です。
:::

このEIP（Ethereum Improvement Proposal）は、開発者がこの種の取引をトークンコントラクトに組み込むための共通の方法と規則を定義しています。
これには、必要な技術用語の説明、インターフェイスの提供、参照実装の示し方が含まれます。
結果として、開発者はこの標準に従ってコントラクトを作ることで、様々なトークン（例えば**ERC20**や**ERC721**など）で互換性のあるオプション取引機能を提供できるようになります。
これにより、ユーザーはより安全で柔軟な方法でオプション取引を行うことが可能になります。

## 動機

アトミックスワップは、ユーザーが信頼できる第三者なしで、ブロックチェーン上で自分のトークンを他の人と直接交換する方法です。
このプロセスを実現するために、ハッシュタイムロックコントラクト（**HTLC**）という特別なコントラクトがよく使われます。
**HTLC**は、取引を安全に行うためのロックとタイマーの機能を提供します。

ただし、**HTLC**を使ったアトミックスワップには「**オプショナリティ**」という特性があります。
これは、スワップを始めた人が数時間のうちに取引を進めるかやめるかを選べるということです。
この選択肢を持つことで、スワップを始めた人は市場の為替レートに基づいて投機する時間を得ることができます。

このオプショナリティの性質から、**HTLC**に基づくアトミックスワップは、金融市場で言う「**アメリカンコールオプション**」と似た性質を持つと考えられています。
アメリカンコールオプションは、購入者が特定の期間内に特定の価格で資産を購入する権利を持つ契約です。
**HTLC**に基づくアトミックスワップは、このオプションと同じような選択権をトークン交換に提供します。

このオプショナリティを活用し、ある研究では、信頼できる第三者なしでアメリカンコールオプションを構築するための安全なアトミックスワップに基づくプロトコルが提案されています。
このプロトコルは、片方の当事者がもう片方のお金を不当にロックすることを防ぐとともに、不公正な取引の機会を排除します。

最終的に、このEthereum Improvement Proposal（EIP）は、このようなプロトコルを**ERC20**や**ERC721**などの既存のトークン標準に組み込むためのガイドラインを提供することを目的としています。
これにより、より安全で公正なトークン交換が可能になり、新しい金融機会が開かれることになります。

## 仕様

### 定義
アトミックスワップに基づくアメリカンコールオプションのスマートコントラクトは、イーサリアムのコントラクトの仕組みを使って、二人の当事者間でトークンの交換を行うためのルールを設定します。
このコントラクトでは、以下のような役割や行動が定義されています。

- **イニシエーター（initiator）**
    - 取引を始める人で、スワップ（交換）の広告を出して、どんな取引をしたいかを公開します。
    - 彼らがこの取引の条件を設定します。
- **パーティシパント（participant）**
    - イニシエーターの広告に興味を持ち、その条件に同意して取引に参加します。
- **アセット（asset）**
    - 交換されるトークンの量を指します。
    - つまり、どれだけのトークンが取引に使われるかです。
- **プレミアム（premium）**
    - イニシエーターがパーティシパントに支払うトークンの量で、オプションを買うための料金のようなものです。
- **リディーム（redeem）**
    - 取引のもう一方からトークンを受け取る行動です。
- **リファンド（refund）**
    - タイムロックが期限切れになったときに、自分自身からトークンを取り戻す行動です。
- **シークレット（secrect）**
    - イニシエーターが選んだランダムな文字列で、取引を安全にするための秘密のキーのようなものです。
- **シークレットハッシュ（secrectHash）**
    - シークレットのハッシュ値で、これを使って**HTLC**を構築します。
- **タイムロック（timelock）**
    - 取引が成立する期限を示すタイムスタンプです。
    - この時間までにアセットが受け取られるべきで、それを過ぎるとリファンド（トークンを取り出す操作）のみ可能になります。

このスマートコントラクトは、**ERC20**や**ERC721**などのトークンを使った取引で、安全かつ公正に行われるように設計されています。
**HTLC**とタイムロックは、取引が正しく行われるようにするための重要なツールで、不正や不公平が起こらないように保証します。

### ストレージ変数

アトミックスワップに基づくアメリカンコールオプションのスマートコントラクトでは、取引を管理するためにいくつかの重要な情報を保存する必要があります。
以下は、その情報を保存するためのストレージ変数の説明です。

#### swap

```javascript
mapping(bytes32 => Swap) public swap;
```

この変数は、スワップコントラクトの基本情報を保持しています。
これには、取引に関わる当事者やトークンの情報が含まれます。
異なる取引はそれぞれ独自の`secretHash`によって識別され、このハッシュを使って取引ごとに保存された情報を区別します。

#### initiatorAsset

```javascript
mapping(bytes32 => InitiatorAsset) public initiatorAsset;
```

イニシエーター（取引を始める側）が交換したいトークンの詳細を保存します。
トークンの量、取引が有効な期間（タイムロック）、そしてその取引の現在の状態がここに記録されます。
この情報は、特定の`secretHash`を持つスワップコントラクトに紐付けられています。

#### participantAsset

```javascript
mapping(bytes32 => ParticipantAsset) public participantAsset;
```

パーティシパント（取引に応じる側）が交換したいトークンの詳細を保存します。
この変数もトークンの量、タイムロック、取引の状態を含み、特定の`secretHash`に紐付けられたスワップコントラクトに関連しています。

#### premiumAsset

```javascript
mapping(bytes32 => Premium) public premium;
```

イニシエーターが提供するプレミアム（取引に付随する料金やボーナス）の詳細を保持します。
プレミアムの量、それが有効である期間、そしてその状態が含まれます。
これもまた、特定の`secretHash`を持つスワップコントラクトに関連しています。

これらの変数は、**ERC20**や**ERC721**などのトークンを使用したスワップ取引が正確に、かつ公平に行われるようにするために重要です。
`secretHash`は、それぞれの取引を一意に識別し、取引に関連する正しいデータにアクセスするための鍵となります。
これにより、当事者間のやり取りがスムーズに、そして安全に行われることを保証します。

### メソッド

アトミックスワップに基づくアメリカンコールオプションのスマートコントラクトには、取引の設定から実行、そして最終的な清算までを管理するための様々なメソッド（関数）があります。
以下では、これらのメソッドをより理解しやすく説明します。

#### **setup**
この関数は、スワップコントラクトを始めるためのものです。
イニシエーターとパーティシパント、交換される**ERC20**や**ERC721**トークン、それぞれのトークン量、そしてプレミアムの量など、取引に必要な情報をすべて設定します。

```javascript
function setup(bytes32 secretHash, address payable initiator, address tokenA, address tokenB, uint256 initiatorAssetAmount, address payable participant, uint256 participantAssetAmount, uint256 premiumAmount) public payable
```

#### **initiate**
イニシエーターが自分のトークンをコントラクトに入れてロックし、スワップを開始するためにこの関数を使います。
ここで設定された条件が後の取引の基礎となります。

```javascript
function initiate(bytes32 secretHash, uint256 assetRefundTime) public payable
```

#### **fillPremium**
イニシエーターがスワップコントラクトにプレミアムを入れてロックするために呼び出します。
プレミアムは、取引の一種の保証金や手数料のようなものです。

```javascript
function fillPremium(bytes32 secretHash, uint256 premiumRefundTime) public payable
```

#### **participate**
パーティシパントがこの関数を使って、取引に参加し、自分のトークンをコントラクトに入れてロックします。
これにより、取引が両方の当事者にとって正式に始まります。

```javascript
function participate(bytes32 secretHash, uint256 assetRefundTime) public payable
```

#### **redeemAsset**
トークンを受け取るために、当事者の一方がこの関数を呼び出します。
これを行うには、ハッシュロックの解除キーとなる「`secret`」を提供する必要があります。

```javascript
function redeemAsset(bytes32 secret, bytes32 secretHash) public
```

#### **refundAsset**
タイムロックが期限切れになった後に、トークンを取り戻すために当事者が呼び出す関数です。
取引が期限内に完了しなかった場合に利用します。

```javascript
function refundAsset(bytes32 secretHash) public
```

#### **redeemPremium**
パーティシパントがプレミアムを受け取るためにこの関数を呼び出します。
ただし、これはトークンの交換が既に行われた後、つまり`participate`が呼び出され、トークンが交換されたか返金された後にのみ可能です。

```javascript
function redeemPremium(bytes32 secretHash) public
```

#### **refundPremium**
プレミアムを取り戻すために、イニシエーターがタイムロックが期限切れになった後にこの関数を呼び出します。

```javascript
function refundPremium(bytes32 secretHash) public
```

これらのメソッドは、スマートコントラクト上でのやり取りを通じて、取引が意図した通りに進むことを保証するために重要です。
それぞれのメソッドが、取引の特定の段階においてどのように機能するかを理解することで、より安全かつスムーズな取引が可能になります。

### イベント

アトミックスワップを利用したアメリカンコールオプションのスマートコントラクトでは、取引の進行に伴い様々なイベントが発生し、それらが取引の進捗や状態の変化を示します。
これらのイベントは取引の透明性を確保し、当事者が現在の状況を把握できるようにします。
以下に各イベントの役割を説明します。

#### SetUp

```javascript
event SetUp(bytes32 secretHash, address initiator, address participant, address tokenA, address tokenB, uint256 initiatorAssetAmount, uint256 participantAssetAmount, uint256 premiumAmount);
```

`SetUp`イベントは、コントラクトが設定されたことを示します。
イニシエーターとパーティシパント、交換される**ERC20**や**ERC721**トークン、トークンの量、プレミアムの量など、取引に必要な基本情報が設定された時に発行します。

#### Initiated

```javascript
event Initiated(uint256 initiateTimestamp, bytes32 secretHash, address initiator, address participant, address initiatorAssetToken, uint256 initiatorAssetAmount, uint256 initiatorAssetRefundTimestamp);
```

`Initiated`イベントは、イニシエーターが自分のトークンをコントラクトに入れてロックしたことを示します。
このイベントは、イニシエーターが取引を開始し、自分のトークンを実際にコントラクトに預けた時に発行します。

#### Participated

```javascript
event Participated(uint256 participateTimestamp, bytes32 secretHash, address initiator, address participant, address participantAssetToken, uint256 participantAssetAmount, uint256 participantAssetRefundTimestamp);
```

`Participated`イベントは、パーティシパントが取引に参加し、自分のトークンをコントラクトに入れてロックしたことを示します。このイベントは、パーティシパントが取引に積極的に参加し始めた時に発行します。

#### PremiumFilled

```javascript
event PremiumFilled(uint256 fillPremiumTimestamp, bytes32 secretHash, address initiator, address participant, address premiumToken, uint256 premiumAmount, uint256 premiumRefundTimestamp);
```

`PremiumFilled`イベントは、イニシエーターがプレミアムをコントラクトに入れてロックしたことを示します。
プレミアムは取引の一種の保証金や手数料のようなもので、このイベントはそれが支払われた時に発行します。

#### InitiatorAssetRedeemed/ParticipantAssetRedeemed

```javascript
event InitiatorAssetRedeemed(uint256 redeemTimestamp, bytes32 secretHash, bytes32 secret, address redeemer, address assetToken, uint256 amount);
```

```javascript
event ParticipantAssetRedeemed(uint256 redeemTimestamp, bytes32 secretHash, bytes32 secret, address redeemer, address assetToken, uint256 amount);
```

`InitiatorAssetRedeemed`と`ParticipantAssetRedeemed`イベントは、資産がタイムロックの前に、取引の他方の当事者によって引き出されたことを示します。
これらのイベントは、相手のトークンを受け取るために必要な秘密の情報が提供された時に発行します。

#### InitiatorAssetRefunded/ParticipantAssetRefunded

```javascript
event InitiatorAssetRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address assetToken, uint256 amount);
```

```javascript
event ParticipantAssetRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address assetToken, uint256 amount);
```

`InitiatorAssetRefunded`と`ParticipantAssetRefunded`イベントは、タイムロックが期限切れになった後に、資産が元の所有者に返金されたことを示します。
取引が期限内に完了しなかった場合にこれらのイベントが発行します。

#### PremiumRedeemed

```javascript
event PremiumRedeemed(uint256 redeemTimestamp,bytes32 secretHash,address redeemer,address token,uint256 amount);
```

`PremiumRedeemed`イベントは、プレミアムがパーティシパントによって引き出されたことを示します。
これは資産がイニシエーターによって引き出されたか、タイムロックが切れてパーティシパントに返金された後に発行します。

#### PremiumRefunded

```javascript
event PremiumRefunded(uint256 refundTimestamp, bytes32 secretHash, address refunder, address token, uint256 amount);
```

`PremiumRefunded`イベントは、プレミアムがタイムロックの期限が切れるまでにパーティシパントが参加しなかったため、イニシエーターに返金されたことを示します。

これらのイベントは、コントラクト上でのやり取りを通じて、取引がどのように進行しているかをリアルタイムで追跡し、当事者間の透明性を確保するための重要な機能です。
それぞれが発行すると、取引の特定の段階が完了したことが示され、関係者は取引の進行状況を正確に把握できるようになります。

## 補足

このスマートコントラクトの理由とその主要な機能について、よりシンプルに説明します。
このコントラクトは、取引が完全かつ安全に行われることを保証するために設計されています。

#### HTLCの使用
取引を「**アトミック**」にするため、つまり取引が完全に実行されるか全く実行されないかのどちらかであることを保証するために、ハッシュタイムロックコントラクト（**HTLC**）を使用します。
これにより、不完全な取引によるリスクがなくなります。

#### **参加者の決定**
イニシエーターが自分のトークンをコントラクトにロックした後、パーティシパントはその条件を確認し、参加するかどうかを決めます。
これにより、パーティシパントは自分にとって納得のいく取引だけを進めることができます。

#### **イニシエーターの決定**
パーティシパントがトークンをロックした後、イニシエーターはその条件を確認し、取引を進めるかどうかを決めます。
これは、イニシエーターが納得している取引のみを完了させることを保証します。

#### **プレミアムの取り扱い**
プレミアムは、パーティシパントが積極的に取引に参加し、条件を満たした場合のみ引き出すことができます。
これにより、パーティシパントは取引に参加するインセンティブを持ちます。

#### **プレミアムの返金**
パーティシパントが全く参加しなかった場合、イニシエーターは自分のプレミアムを取り戻すことができます。
これはイニシエーターにとっての保護措置です。

これらのルールにより、**ERC20**や**ERC721**トークンを使用する取引が公平かつ効率的に行われ、各当事者が情報に基づいて適切な決定を下せるようになります。
このシステムは、当事者間のやり取りを通じて、取引が正しく進行することを保証します。

### セキュリティ

#### **取引開始時刻の重要性**
`initiateTimestamp`は取引の全期間を覆うものでなければなりません。
これは、取引のスタートからエンドまでのタイミングをしっかりと管理し、取引が計画どおりに進むことを確かめるためです。
このタイムスタンプが正しく設定されていれば、取引が中途半端に終わるリスクを防げます。

#### **プレミアムの扱い**
パーティシパントは、イニシエーターがプレミアムをコントラクトに入れるまで、絶対に取引に参加してはいけません。プレミアムは取引の保証金のようなもので、これが支払われるまでパーティシパントは自分のトークンをコントラクトに預けるべきではありません。
このルールにより、イニシエーターが約束した金額をしっかりと支払うことが保証され、パーティシパントの安全が確保されます。

これらの点をしっかりと守ることで、**ERC20**や**ERC721**トークンを使用した取引が安全に、そして公平に行われます。
すべての当事者がこれらのルールに従うことで、予期せぬリスクや不公平が生じることを最小限に抑え、スムーズな取引を実現できます。

### 互換性

この提案は、今までのシステムと完全に互換性があり、新しい機能を追加するだけで、既存の機能には全く影響を与えません。
これは、**ERC20**や**ERC721**などの既存のコントラクトが、この提案を採用しても変わらずに動き続けることを意味します。
新しい機能が加わっても、今まで通りの動作を保証するので、既存のシステムやアプリケーションは安全です。

### 実装

実装コードは以下に格納されています。

https://eips.ethereum.org/assets/eip-2266/Example.sol

### 参考

- [Hash Time Locked Contracts](https://en.bitcoin.it/wiki/Hash_Time_Locked_Contracts)
- [An Argument For Single-Asset Lightning Network](https://lists.linuxfoundation.org/pipermail/lightning-dev/2019-January/001798.html)
- [On the optionality and fairness of Atomic Swaps](https://eprint.iacr.org/2019/896)

### 引用

Runchao Han <runchao.han@monash.edu>, Haoyu Lin <chris.haoyul@gmail.com>, Jiangshan Yu <jiangshan.yu@monash.edu>, "ERC-2266: Atomic Swap-based American Call Option Contract Standard [DRAFT]," Ethereum Improvement Proposals, no. 2266, August 2019. [Online serial]. Available: https://eips.ethereum.org/EIPS/eip-2266.

## 最後に

今回は「第三者を介さずにトークンを直接交換できる、アトミックスワップの仕組みを提案している規格である**ERC2266**」についてまとめてきました！
いかがだったでしょうか？

質問などがある方は以下の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
