---
# System prepended metadata

title: Feeの支払いについて

---

# Feeの支払いについて

## 支払いがセキュアであるための条件

### 必須条件

1. InvoiceのPreimageは支払いが完了するまで判明してはいけない
    (支払い前にproofを提出できてしまう)
~~2. Invoiceが正しいInvoiceであることはユーザーがしはらうまでに検証可能でないといけない~~
~~（LNでのPaybackができないため）~~
3. ただしいメッセージ交換が行われている場合、リーダーが交代するまでにすべての通信が必ず完了し、その後のメッセージはすべて無効である（Invoiceの有効期限もふくめ）
4. オペレーターは支払いを受けたのであれば必ずTxが発行可能な状況でなければならない
5. Txを実行しなかった場合、確実にClaimできる
6. **Txを実行した場合、確実にClaimできない**


### ほしい条件

- できればL1ですべての検証が完結したい
- L2上のSMTの更新はなしにしたい


## Invoice SMTは更新せず、Incoice Merkle rootも提出しない

- Invoiceは自分のリーダー権限が切れる前に有効期限が切れるようにする
- 署名に使う鍵（LNのdestination addressのpubkeyとは異なっていてよい）を先にcommitしておく、もしくはオペレーターのアドレスの公開鍵を使用する
- わたすときにSig(Hash(invoice + txhash))を渡す

Lazy Operator
- sigPubkey = Public key for signature
- sigPrivkey = Private key for signatures

```mermaid
sequenceDiagram
actor U as User
participant O as Operator
participant T as Totoro Network
participant F as L1 Chain

autonumber
O -->> F : Stake token
U -->> O : Throw Tx data
O -->> O : Calc gas fee
O -->> O : Prepare Invoice (Preimage = hash(sig(Tx, sigPrivkey) + salt))
O -->> U : Retern receipt, invoice
O -->> U : Retern OPSIG = Sig(Hash(invoice))
U -->> U : Validate Invoice and Signature
U -->> O : Pay Fee through LN
U -->> O : LN Payment
O -->> O : Hold Tx
O -->> O : Leader Changed
U -->> F : Submit Tx(including onetime address), Invoice, OPSIG, preimage, Operator's pubkey
F -->> F : Check if Operator is lazy
F -->> O : Slash Lazy OP's stake
O -->> U : Transfer staking token(LN BTC?)
```
## セキュリティ

### 必須条件

- 1について => Preimageのランダム値を明かさなければpreimageは判明しない
- 2について => ランダム値を渡せばtxDataからpreimageがわかるので正しいinvoiceであることがわかる
    => **両方をみたすことは不可能**
- 3について => 満たしている
- 4について => Invoiceが漏れていなければ、Diffの受け取りを承知したこととLNでFeeを支払ったことは同一視してよい
- 5について => 可能
- 6について => **正規実行されたTxからのfee Claimを防ぐには、L1にL2Txをコミットするぐらいしか弾く方法がない？**
    => その担当オペレーターがリーダーであった間に、txで使用したonetime addressが入っていないことを確認できれば良い

### ほしい条件

- いずれも満たしている

## Invoice SMTは更新せず、Incoice Merkle rootは提出する

- 最初に使用予定のInvoiceのhashのMT rootと署名に使う鍵（LNのdestination addressのpubkeyとは異なっていてよい）をL1に提出する
- Invoiceは自分のリーダー権限が切れる前に有効期限が切れるようにする
- Invoiceを漏らさないためuserの公開鍵で暗号化する(?)
- わたすときにSig(Hash(Hash(invoice) + txhash))を渡す

Lazy Operator
- sigPubkey = Public key for signature
- sigPrivkey = Private key for signatures
- userPubkey = User's public key

```mermaid
sequenceDiagram
actor U as User
participant O as Operator
participant T as Totoro Network
participant F as L1 Chain

autonumber
O --> F : Stake token
O --> F : Submit Invoice Merkle root
U --> O : Throw Tx data
O --> O : Calc gas fee
O --> U : Retern receipt, Enc(invoice, userPubkey)
O --> U : Retern OPSIG = Sig(Hash(invoice) + Hash(txid), sigPrivkey)
U --> U : Validate Invoice and Signature
U --> O : Pay Fee through LN
U --> O : LN Payment
O --> O : Hold Tx
O --> O : Leader Changed
U --> F : Submit Tx, Invoice, OPSIG, preimage, Operator's pubkey
F --> F : Check if Operator is lazy
F --> O : Slash Lazy OP's stake
O --> U : Transfer staking token(LN BTC?)
```
## セキュリティ

### 必須条件

- 1について => preimageはネットワークとは無関係なのでpreimageをしることは出来ない
- 2について => MT rootから正しいInvoiceかどうかは検証可能
- 3について => 満たしている
- 4について => Invoiceが漏れていなければ、Diffの受け取りを承知したこととLNでFeeを支払ったことは同一視してよい
- 5について => OPSIGが正しければ必ずそのinvoiceはtxhashと結びついていることがわかるので
- 6について => **正規実行されたTxからのfee Claimを防ぐには、L1にL2Txをコミットするぐらいしか弾く方法がない？**
    => その担当オペレーターがリーダーであった間に、txで使用したonetime addressが入っていないことを確認できれば良い


### ほしい条件

- いずれも満たしている



## 注意点
- リーダーの交代はあるtimestampをもってかならず交代されなければならない


## トークンの利用について

- 中途半端ならトークンを全く発行しなくて良いとおもう
- トークンを使うならガッツリfeeの支払いorオペレーターへの報酬に使って需要喚起したほうがいい
    => LN払いを
- Wrapped ETHはコア層にOracleへの依存を残してしまう点で懸念が残る