# 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への依存を残してしまう点で懸念が残る