---
# System prepended metadata

title: 払い戻しに関するメモ

---

# 払い戻しに関するメモ

## 問題点

- 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
```