# LN払い戻しが必要ないという話
## そもそも払い戻しをどのような場面で用いるべきか?
- 何らかの不備でTxを処理できなかった場合(Txが多すぎなど)
=> OperatorがそもそもTxを受け付けるか決定する。Operatorが受けなきゃいいだけ。よってFeeを払ったらClaimできるようにしてよい。
- 数値が合わなくて途中でRevertした場合(つまりGasが余った場合)の返却
=> そもそも返却額が未知数なのでトラストレスな返却はかなり難しい(あらかじめInvoiceを貼ることが出来ない)。OPの善意で払い戻すことならできる。
- Diffの署名を即レスしてくれたときのキャッシュバック
=> そもそもこれは「キャンペーン」という位置づけで受け入れ如何はOPが判断するという内容でいいのでは?
### 結論
以上のように考えると考え方によっては払い戻しは必ずしも必要ないということになる
## 払い戻しをする場合のメカニズム
### 払い戻し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
```
### 払い戻しをする場合の要件
払い戻しをする場合はユーザーからのInvoiceを「必ず」オペレーターが処理しなくてはならず、ユーザーの悪意のあるInvoiceに対処できない。
(あくいのあるInvoiceというのはOPSIGを受け取った後にルーティングにボッタクリノードをかませる、そもそも自分を孤立させて支払い不可にする、など)
そのためClaimにおいては以下の条件が必要になる
1. 支払ったFeeとほぼ同額返金させる必要がある
2. 1を満たそうとするとClaimでのGas負けが発生するため、ClaimはL2上で行う
3. BTCを返金しない場合はOracleを用意して正しい金額を返還する。
## Diff署名即レス時の対応(トラストあり)
Diff署名を返した際にInvoiceの署名(Diffを署名したのと同じ鍵で署名する)を渡せば良い。これを返還するかどうかはOP次第。
Revert時の対応も同様にInvoiceを渡してあまりにもFeeが余った場合だけ返還する。
## 結論
払い戻しはユーザーに対するトラストを排除しようとすると条件が難しくなり、開発コスト高になってしまうのでキャッシュバック等はOP側の善意という体にしてClaimはOPがTxを処理しなかったとき限定で少し多めにL1など開発コストの低いチェーンにおいてClaimできるようにしてやるのが良さそう。