# 払い戻しに関するメモ
## 問題点
- LNをの支払いをユーザーが行わない場合などがあるため順番がずれる可能性がある => そうするとユーザーが承諾したDiffと異なる状態が生まれてしまう可能性がある
- かといって前のユーザーの支払いを待っているとTPSが大きく落ちてしまう
- また、Diffが変化した場合、LNで支払っていたfeeを戻してやる必要がある(あるいはDiffを変化させることでslashを誘発する攻撃を防ぐ必要がある)
## 達成したい状態
- 前のゆーざーの支払いを待たなくても並列で処理できる形態をつくる
- 悪意のあるフロントランニングが起きにくい状態をつくる
- とはいえDiffが異なったらすぐrevert、となってしまうと大きくUXが落ちてしまうため、ユーザーが承認している範囲ではなるべくTxを通すようにする
## feeの払い戻しメカニズムについて考える
### 払い戻しInvoiceの追加
- TxPayloadに払い戻しinvoiceを含める(これはL2にはつっこまない)
- 払い戻しInvoiceの有効期限はオペレーター交代よりも前である必要がある
- OPからの署名にはこの払い戻しTxを入れる必要はない
### 払い戻しTxを渡す(これは特殊なTx)
- 払い戻しtxも同じonetimeaddressで作成し渡す(このtxにはhash(true_preimage)がついており、preimageを追加して一致すると有効化されるtx)
- 払い戻しTxはDiffを発行しない特殊なTxでPreimage HashとPreimageが一致していると有効化されるTxである
- この場合、DiffのOneTimeAddress SMTにユーザーのOneTimeAddressが追加されることになる
### 払い戻す場合
- invoiceに対して払い戻す
- Preimageを保存する
- preimageを払い戻しtxに追加して払い戻しtxを実行する
```mermaid
sequenceDiagram
actor U as User
participant O as Operator
autonumber
U --> O : Send Tx with payback invoice
U --> O : Send PayBack Tx(without preimage of payback Invoice)
O --> U : Send OPSIG (= Sig(Hash(Prefix + Hash(invoice) + OneTimeAddress), sigPrivkey)))
U --> U : Validate OPSIG
O --> U : Pay LNBTC to Payback Invoice
U --> O : Send Preimage
O --> O : Add Payback Tx with PreImage
```
### 払い戻されなかったことを証明する場合
- 普通にclaimを行う(この際払い戻されていれば払いもどしtxでonetimeaddressが使用されているため、claimが通らない)
```mermaid
sequenceDiagram
actor U as User
participant O as Operator
participant B as L1 Chain
autonumber
U --> O : Send Tx with payback invoice
U --> O : Send PayBack Tx(without preimage of payback Invoice)
O --> U : Send OPSIG
U --> U : Validate OPSIG
O --> O : Hold Tx without payback
O --> O : Change Leader
U --> B : Submit OneTimeAddress, Invoice, OPSIG, preimage
B --> B : Check if Operator is lazy
B --> O : Slash Lazy OP's stake
O --> U : Transfer staking token
```
-
## 払い戻しを含めた並列処理の仕組みについて
- 払い戻しtxを渡す
- ユーザーに対してありうるすべてのdiffの組を渡す(同じglabal stateの番地にアクセスしているユーザーがいる場合、そのtxの数だけdiffの組がある)
- 受け入れ可能なdiffに署名して渡す
- もしユーザーが受け入れ不可能な順番になった場合は払い戻しtxを実行する
```mermaid
sequenceDiagram
actor U as User
participant O as Operator
autonumber
U --> O : Send Tx with payback invoice
U --> O : Send PayBack Tx(without preimage of payback Invoice)
O --> O : Calc Possible Diffs
O --> U : Send all Diffs
U --> U : Sign acceptable Diffs
U --> O : Send signed Diffs
O --> O : Try execution of Tx
O --> U : (If diff is unacceptable for User) Pay to payback invoice
O --> O : Execute Payback Tx
```