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