# 払い戻しに関するメモ ## 問題点 - 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 ```