NEM2カタパルトで双方向ペイメントチャネルするには その１ 概要

# はじめに

オフチェーンプロトコルのひとつに、ペイメントチャネルというのがある。

ビットコインでは、下記の素晴らしいポストがある。

双方向のPayment Channelの仕組み - Develop with pleasure! https://techmedia-think.hatenablog.com/entry/2016/08/06/212453

こちらを参考に、カタパルトではどうなるのかを考えてみる。


# 概要図

まずは、ビットコインのものを図示してみる。

![payment_channel.jpg](https://qiita-image-store.s3.amazonaws.com/0/172833/906ac147-274e-2db4-3c7f-ce93a3172c7e.jpeg)

それを、カタパルトに置き換えてみた。

![payment_channel (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/172833/63f0e5bd-4784-b3df-d6c7-33eba8bc084e.jpeg)



# 解説

登場人物はAliceとBob。

お互い頻繁に取引をしている関係であるとする。この度、ペイメントチャネルというものがあると聞いて、導入してみたいと思っていた。

たまたま、AliceからBobへ1XEM送金する取引が発生したので、ペイメントチャネルをオープンすることにした。

まずは、お互いに5XEMずつ預け入れるところからスタートする。そして、1XEM送金の取引をペイメントチャネル上で完了させる。

## Channelのオープン

### マルチシグアカウントの作成

ビットコインと異なり、マルチシグアカウントはオンチェーンで作成する必要がある。AliceとBobの2of2マルチシグアカウントを作成する。

### Opening Transactionの作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/6079d9ff-15e7-5490-8c0c-62882957a96f.png)

Aliceは、AliceとBobから5XEMずつをマルチシグアカウントへDepositするトランザクションを作成する。

これは、Aggregate Transactionで実現する。Aliceでなくても、Bobがやってもよい。

**この時点では、トランザクション作成のみで、送信はしない**


### Commitment Transactionの作成

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/4d4837e3-f542-aeb5-70bb-efba3d61aadf.png)

まず、お互いに、シークレットを作成し、ハッシュ値を交換する。

次にAliceは、4XEMを自身に、6XEMを以下の条件付きでBobに送るトランザクションを作る。

Bitcoinの場合は、

> ボブ自身でロックが解除できるけど、解除するためにはこのコミットメントトランザクションがブロックに含まれてから1000ブロック経過する必要がある（OP_CSVでタイムロックしている）。
> アリス自身で解除できるが、ボブがアリスに送ったハッシュの元となるシークレットをアリス自身が知っている必要がある。（この時点でアリスはハッシュは知っているが、そのシークレットが何かは分からないので、現時点ではアリスがロックを解除することはできない。）

catapultで置き換えてみると、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/ec56b13c-5905-605c-8ab0-2b49cd530ae9.png)

Bobは10000ブロック経たないと、6XEMを受け取れない。（ブロック生成時間が1分の場合）また、Bobのシークレットがあれば、Aliceが受け取れる。このような条件を満たすには、

1. Bobに6XEM送るTransfer Transaction
2. BobからAliceに6XEM送るSecret Lock Transaction
	- Durationは10000ブロック
	- Bobのシークレット(xb1)で解除できる

これによって、Bobに送られた6XEMは、瞬時にロックされるが、10000ブロック経てば有効期限切れでBobへ戻ってくる。しかし、Bobがシークレットを明かせばAliceの受け取りが可能になる。

この時点ではAliceはH(xb1)は知っているが、xb1は知らないので、Secret Proof Txを作成することはできない。

この2つのTransfer Txと、Aliceに4XEMを送るTransfer Txを合わせて、Aggregate Txにする。

まとめると、Commitment Transactionは、以下のようになる。

- Aggregate Tx
    - Aliceに4XEM送るTransfer Transaction
    - Bobに6XEM送るTransfer Transaction
    - BobからAliceに6XEM送るSecret Lock Transaction
        - Durationは10000ブロック
        - Bobのシークレット(xb1)で解除できる
- Lock Funds Tx

Aliceはこれらに署名をし、Bobに送る。

一方Bobも同様のことを行う。

（Lock Fundsだけアナウンスされてしまう恐れがある。対策のひとつとして、Aggregate Completeにして、オフラインで両者が署名できると、Lock Fundsは不要になる。ふたつ目は、Lock FundsのDurationを可能な限り短くする。）

### Opening Transactionの送信

シークレットとCommitment Transactionの交換が完了すると、AliceはOpening Transactionをアナウンスし、BobはこれにCosignする。

この時点でお互いは、Commitment Transactionをアナウンスし、Cosignすることができる。そのときPayment Channelは閉じられたことになる。チャネルを継続する場合は、アナウンスしない。

### Channelのアップデート

新たにBobからAliceへ1XEM送金する取引が発生したとする。

このため、Aliceへ5XEM、Bobへ5XEMとなるCommitment Transactionを作成ることになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/b05fad40-6823-fcec-0230-3d1e8acc056b.png)

まず、お互いに、シークレットを作成し、ハッシュ値を交換する。

（必ず新しいシークレットを作成する。）

次にAliceは、マルチシグアカウントから、5XEMを自身に、5XEMを以下の条件付きでBobに送るトランザクションを作る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/ec4e2a1d-96d4-0c54-5563-27998ddc164d.png)

Commitment Transactionは、以下のようになる。

- Aggregate Tx
    - Aliceに5XEM送るTransfer Transaction
    - Bobに5XEM送るTransfer Transaction
    - BobからAliceに5XEM送るSecret Lock Transaction
        - Durationは10000ブロック
        - Bobのシークレット(xb2)で解除できる
- Lock Funds Tx

Aliceはこれらに署名をし、Bobに送る。

Bobも同様のことをする。

そして、お互いに古いシークレットを明かす。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/84ad35b9-585c-84d6-d53f-28ccbefbe05d.png)

この時点でお互いは、Commitment Transactionをアナウンスし、Cosignすることができる。そのときPayment Channelは閉じられたことになる。

## 裏切り

ここで、Bobは悪いことを思いついたとする。

2つ目のCommitment Transactionでは、5XEMしか手に入らない。

しかし、1つ目のそれでは、6XEM手に入ることになる。

Bobがアナウンスできる1つ目のCommitment Transactionは、このような内容になっている

![image.png](https://qiita-image-store.s3.amazonaws.com/0/172833/c531fc9a-15df-2c30-d9f9-2f6cf6ab116a.png)

- Aggregate Tx
    - Aliceに4XEM送るTransfer Transaction
    - Bobに6XEM送るTransfer Transaction
    - BobからAliceに6XEM送るSecret Lock Transaction
        - Durationは10000ブロック
        - Bobのシークレット(xb1)で解除できる

Bobはこれをアナウンスし、Cosignしたとする。

- まずは、Aliceに4XEM着金する。
- Bobへ6XEM着金するが、即座に6XEMはSecret Lock Txによりロックされる。
  - 10000ブロック経つと、期限切れとなりBobへ6XEM返ってくる。
  - xb1で解除されると、Aliceへ送金される。

ここでキーとなるxb1は、先ほどAliceへ送っていた。

これにより、Bobが裏切った結果、Aliceは全額の10XEMを受け取ることができるようになっている。

**裏切った場合、全額取られてしまう。そのため古いCommitment Transactionを送信するインセンティブが低い**

# 課題

カタパルト特有の課題がいくつか存在する。

- マルチシグアカウントを作成するのに手数料が必要となる。どちらがどのように負担するのかは、あらかじめ決めておく必要がある。
- LockFundsTxのみを送信される可能性がある。
- Deadlineの制約を受ける。24時間に設定されていた場合、24時間ごとにCommitment Transactionを交換し続けるか、ペイメントチャネルを閉じる日時を定めておいて、それに合わせる必要がある。
- どこかに攻撃点がありそう。

# 関連

NEM2カタパルトで双方向ペイメントチャネルするには その１ 概要
https://qiita.com/planethouki/items/c22a21836d913418de82

NEM2カタパルトで双方向ペイメントチャネルするには その２ トランザクションは作れるのか
https://qiita.com/planethouki/items/53415a14b34bebd450fc

NEM2カタパルトで双方向ペイメントチャネルするには その３ ペイロードの送信と罰則
https://qiita.com/planethouki/items/945239fe04d2af1fb203