# Atomic SwapのTotoro上での利用方法・制限などについて概要
## Atomic Swapについて
- Atomic Swapは異なるチェーン間でMultisigのウォレットにお互いに送金し、片方がSecretを公開することでもう片方の資金の引き出しを行えるようにして交換を成立させる
```mermaid
sequenceDiagram
actor a as Alice
participant A as ChainA
participant B as ChainB
actor b as Bob
autoNumber
a --> A : Trasnfer ChainA Token to Multisig
a --> b : Send hash of Alice's secret
b --> B : Transfer ChainB Token to Multisig
a --> b : Send private key
b --> a : Send private key
a --> B : Send Alice's sig and Alice's secret (Timelock)
b --> A : Send Bob's sig and Alice's secret
A --> b : Tranasfer ChainA token
B --> a : Transfer ChainB token
```
## EthereumでのAtomic Swap
こちらに[Solidity](https://github.com/confio/eth-atomic-swap/blob/master/contracts/AtomicSwapEther.sol)でのEther-BTCの実装がある。
- こちらではより単純にBTC側が設定したSecret Hashの原像が正しければEtherをおくるシンプルなもの
- BTCでEther側の検証ができないため、ChainBがEtherで固定される
- Gasはそこそこたかそう(Atomic swapごとにコントラクトをデプロイしなくても済む設計に直したとしても、毎回21000 * 4 + 送金&計算コストと21000 * 2 + 送金&計算コストがかかってくる感じ)
- 基本的にBTCのUnlock条件と同じ条件をsolidityで設定し、それをみたすデータが与えられたら(つまりBTC受け取り側がBTCを貰える状態になったら)ERC20トークンを送金するだけなので、基本的なロジックは同じ
## Totoro上でのAtomic Swapの利点
- L1上だとgas代が見合ってないがよりgas代がやすいため気軽に使える
- Atomic SwapをTotoro上でトレースすることが可能
=> DeFiなどで利用できる?
- また、コストが安いので無理やりHTLCを乗っけることでなんちゃってWBTCが可能(後述)
## なんちゃってWBTCの仕様
### 概要
- このなんちゃってWBTCはAtomic Swapで利用されるHTLCをネットワーク上で記録し、トレースすることで生まれる
- もしsecretが公開され、BTCが引き出そうとしていた場合はtimelock期間中にWBTCを没収することができる
- 2種類のSecretを用意することでふせげる?
### 利用するHTLCの仕様
- ロックを解除するには
1. 送金元の署名
2. 送金先のアドレスの署名
3. シークレット
を保有している必要がある
ただし、ブロードキャストした後に一定期間Time lock(絶対Time lock?)されることに注意
### mint
- 任意のアドレス(自分が保有しているアドレスで良い)に上記のmultisigのウォレットを作成し、送金する(これはBitcoin ネットワークにデプロイする)
- 自身の署名を作成する
- これらをまとめてTotoroに提出する
- 検証してWBTCを発行する
```mermaid
sequenceDiagram
participant B as Bitcoin
actor a as Alice
participant T as Totoro
autonumber
a --> B : Deposit to Multisig Address
a --> T : Add Alice's signiture and Submit HTLC
T --> T : Verify HTLC and mint WBTC
T --> T : Link WBTC amount to hash of secret
T --> a : Return diff
```
## Burn
- Totoroに対してシークレットを公開することでBurnが完了する
- もし、HTLCから勝手に資金を引き出していた場合はSecretを提出することでWBTCを没収することができる
```mermaid
sequenceDiagram
actor a as Alice
participant T as Totoro
autonumber
a --> T : Reveal secret
T --> T : Verify Secret
T --> T : Burn WBTC
T --> a : Return diff
```
不正していた場合
```mermaid
sequenceDiagram
participant B as Bitcoin
actor a as Alice
actor c as Carol
participant T as Totoro
autonumber
a --> B : Use HTLC without notice (Time Lock)
c --> B : Get Alice's secret
c --> T : Submit secret
T --> T : Verify Secret
T --> T : Burn WBTC
T --> a : Impose some penalty and Return diff
T --> c : Get some incentives
```
## Transfer
- Transferは基本的には存在しない
- 相手方からSecretのHashをもらい、Burnしてから相手方に対してMintすることで送金が可能
```mermaid
sequenceDiagram
actor a as Alice
actor b as Bob
participant T as Totoro
autonumber
b --> a : Submit some secret
a --> T : Burn WBTC
a --> T : Mint new WBTC to Bob's address with Bob's secret
T --> T : Mint remaining WBTC to Alice's address
```
## 限界
- バーンにどうしてもTime Lock分の時間がかかってしまう
- Bitcoinネットワークへのデプロイの回数を減らしたい(すくなくとも送金でのデプロイをなくしたい)
- bitcoinを監視している必要がある
- お互いに秘密鍵を保有している必要がある
=> つまりiOとかでなければコントラクトは秘密鍵を持てないのでコントラクトにデポジットすることは出来ない
=> とはいえNFTの支払いなどはこれで相手方にTransaferすることができる
###### tags: LN