From f5a45a94f6e5741bedf7c3da4f1a0ac92ad82bb1 Mon Sep 17 00:00:00 2001 From: Ethan Frey Date: Tue, 13 Feb 2018 21:05:23 +0100 Subject: [PATCH] Clean up optimization section --- docs/spec/ibc/images/CleanUp.png | Bin 0 -> 38843 bytes docs/spec/ibc/optimizations.md | 288 ++++--------------------------- 2 files changed, 36 insertions(+), 252 deletions(-) create mode 100644 docs/spec/ibc/images/CleanUp.png diff --git a/docs/spec/ibc/images/CleanUp.png b/docs/spec/ibc/images/CleanUp.png new file mode 100644 index 0000000000000000000000000000000000000000..b9b5a1d348bdf5deb6a38fd80bca90bfd67f870e GIT binary patch literal 38843 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.send_ or _B:qA.receipt_ we currently have the following guarantees: -_A:Mk,v,h = _ +_A:Mk,v,h =_ ∅ _if message i was not sent before height h_ -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

+_A:Mk,v,h =_ ∅ _if message i was sent and receipt received before height h (and the receipts for all messages j < i were also handled)_ -_if message i was not sent before height h_ +_A:Mk,v,h _ ≠ ∅ _otherwise (message result is not yet processed)_ -_A:Mk,v,h = _ +_B:Mk,v,h =_ ∅ _if message i was not received before height h_ -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

+_B:Mk,v,h _ ≠ ∅ _if message i was received before height h (and all messages j < i were received)_ -_if message i was sent and receipt received before height h _ - - - _(and the receipts for all messages j < i were also handled)_ - -_A:Mk,v,h _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- - - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_otherwise (message result is not yet processed)_ - -_B:Mk,v,h = _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_if message i was not received before height h_ - -_B:Mk,v,h _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- - - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_if message i was received before height h_ - -_ (and all messages j < i were received)_ - -Based on these guarantees, we can make a few modifications of the above protocol to allow us to prove timeouts, by adding some fields to the messages in the send queue, and defining an expired function that returns true iff _h > maxHeight_ or _timestamp(Hh ) > maxTime._ +Based on these guarantees, we can make a few modifications of the above protocol to allow us to prove timeouts, by adding some fields to the messages in the send queue, and defining an expired function that returns true iff _h > maxHeight_ or _timestamp(Hh ) > maxTime_. _Vsend = (maxHeight, maxTime, type, data)_ -_expired(Hh ,Vsend ) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_[true/false]_ +_expired(Hh ,Vsend )_ ⇒ _[true/false]_ We then update message handling in _IBCreceive_, so it doesn't even call the handler function if the timeout was reached, but rather directly writes and error in the receipt queue: _IBCreceive:_ - -_ …._ - -_ expired(latestHeader, v) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_push(qS.receipt , (None, TimeoutError));_ - -_ v = (_, _, type, data) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_(result, err) :=ftype(data); push(qS.receipt , (result, err)); _ + * …. + * _expired(latestHeader, v)_ ⇒ _push(qS.receipt , (None, TimeoutError)),_ + * _v = (\_, \_, type, data)_ ⇒ _(result, err) := ftype(data); push(qS.receipt , (result, err));_ and add a new _IBCtimeout_ function to accept tail proofs to demonstrate that the message was not processed at some given header on the recipient chain. This allows the sender chain to assert timeouts locally. -_S:IBCtimeout(A, Mk,v,h) _ -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_ match_ - -_qA.send =_ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- - - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("unregistered sender"), _ - -_ k = (_, send, _) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("must be a receipt"),_ - -_ k = (d, _, _) and d _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_S_ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("sent to a different chain"),_ - -_ Hh _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_TA _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("must submit header for height h"),_ - -_ not valid(Hh ,Mk,v,h ) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("invalid merkle proof"),_ - -_ k = (S, receipt, tail)_ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_match_ - - - _tail _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_head(qS.send )_ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("receipt exists, no timeout proof")_ - - - _not expired(peek(qS.send )) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("message timeout not yet reached")_ - - - _default _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_(_, _, type, data) := pop(qS.send ); rollbacktype(data); Success_ - - - _default _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("must be a tail proof")_ +_S:IBCtimeout(A, Mk,v,h)_ ⇒ _match_ + * _qA.send =_ ∅ ⇒ _Error("unregistered sender"),_ + * _k = (\_, send, \_)_ ⇒ _Error("must be a receipt"),_ + * _k = (d, \_, \_) and d_ ≠ _S_ ⇒ _Error("sent to a different chain"),_ + * _Hh_ ∉ _TA_ ⇒ _Error("must submit header for height h"),_ + * _not valid(Hh , Mk,v,h )_ ⇒ _Error("invalid merkle proof"),_ + * _k = (S, receipt, tail)_ ⇒ _match_ + * _tail_ ≥ _head(qS.send )_ ⇒ _Error("receipt exists, no timeout proof")_ + * _not expired(peek(qS.send ))_ ⇒ _Error("message timeout not yet reached")_ + * _default_ ⇒ _(\_, \_, type, data) := pop(qS.send ); rollbacktype(data); Success_ + * _default_ ⇒ _Error("must be a tail proof")_ which processes timeouts in order, and adds one more condition to the queues: -_A:Mk,v,h = _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_if message i was sent and timeout proven before height h_ - - - _(and the receipts for all messages j < i were also handled)_ +_A:Mk,v,h =_ ∅ _if message i was sent and timeout proven before height h (and the receipts for all messages j < i were also handled)_ Now chain A can rollback all transactions that were blocked by this flood of unrelayed messages, without waiting for chain B to process them and return a receipt. Adding reasonable time outs to all packets allows us to gracefully handle any errors with the IBC relay processes, or a flood of unrelayed "spam" IBC packets. If a blockchain requires a timeout on all messages, and imposes some reasonable upper limit (or just assigns it automatically), we can guarantee that if message _i_ is not processed by the upper limit of the timeout period, then all previous messages must also have either been processed or reached the timeout period. @@ -192,118 +64,30 @@ While we clean up the _send queue_ upon getting a receipt, if left to run indefi The observant reader may also notice, that when we perform the timeout on the sending chain, we do not update the _receipt queue_ on the receiving chain, and now it is blocked waiting for a message _i_, which **no longer exists** on the sending chain. We can update the guarantees of the receipt queue as follows to allow us to handle both: -_B:Mk,v,h = _ +_B:Mk,v,h =_ ∅ _if message i was not received before height h_ -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

+_B:Mk,v,h =_ ∅ _if message i was provably resolved on the sending chain before height h_ -_if message i was not received before height h_ - -_B:Mk,v,h = _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_if message i was provably resolved on the sending chain before height h_ - -_B:Mk,v,h _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- - - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_otherwise (if message i was processed before height h,_ - -_ and no ack of receipt from the sending chain)_ +_B:Mk,v,h _ ≠ ∅ _otherwise (if message i was processed before height h, and no ack of receipt from the sending chain)_ Consider a connection where many messages have been sent, and their receipts processed on the sending chain, either explicitly or through a timeout. We wish to quickly advance over all the processed messages, either for a normal cleanup, or to prepare the queue for normal use again after timeouts. Through the definition of the send queue above, we see that all messages _i < head_ have been fully processed, and all messages _head <= i < tail_ are awaiting processing. By proving a much advanced _head_ of the _send queue_, we can demonstrate that the sending chain already handled all messages. Thus, we can safely advance our local _receipt queue_ to the new head of the remote _send queue_. -_S:IBCcleanup(A, Mk,v,h) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_ match_ - -_qA.receipt =_ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- - - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("unknown sender"), _ - -_ k = (_, send, _) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("must be for the send queue"),_ - -_ k = (d, _, _) and d _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_S_ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("sent to a different chain"),_ - -_ k_ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_ (_, _, head) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("Need a proof of the head of the queue"),_ - -_ Hh _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_TA _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("must submit header for height h"),_ - -_ not valid(Hh ,Mk,v,h ) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("invalid merkle proof"),_ - -_ head := v _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_match_ - -_ head <= head(qA.receipt) _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_Error("cleanup must go forward"),_ - -_ default _ - -

>>>>> gd2md-html alert: equation: use MathJax/LaTeX if your publishing platform supports it.
(Back to top)(Next alert)
>>>>>

- -_advance(qA.receipt , head); Success_ +_S:IBCcleanup(A, Mk,v,h)_ ⇒ _match_ + * _qA.receipt =_ ∅ ⇒ _Error("unknown sender"),_ + * _k = (\_, send, \_)_ ⇒ _Error("must be for the send queue"),_ + * _k = (d, \_, \_) and d_ ≠ _S_ ⇒ _Error("sent to a different chain"),_ + * _k_ ≠ _(\_, \_, head)_ ⇒ _Error("Need a proof of the head of the queue"),_ + * _Hh_ ∉ _TA_ ⇒ _Error("must submit header for height h"),_ + * _not valid(Hh ,Mk,v,h )_ ⇒ _Error("invalid merkle proof"),_ + * _head := v_ ⇒ _match_ + * _head <= head(qA.receipt)_ ⇒ _Error("cleanup must go forward"),_ + * _default_ ⇒ _advance(qA.receipt , head); Success_ This allows us to invoke the _IBCcleanup _function to resolve all outstanding messages up to and including _head_ with one merkle proof. Note that if this handles both recovering from a blocked queue after timeouts, as well as a routine cleanup method to recover space. In the cleanup scenario, we assume that there may also be a number of messages that have been processed by the receiving chain, but not yet posted to the sending chain, _tail(B:qA.reciept ) > head(A:qB.send )_. As such, the _advance_ function must not modify any messages between the head and the tail. - - -

>>>>> gd2md-html alert: inline image link here (to images/Cosmos-IBC3.png). Store image on your image server and adjust path/filename if necessary.
(Back to top)(Next alert)
>>>>>

- - -![alt_text](images/Cosmos-IBC3.png "image_tooltip") +![Cleaning up Packets](images/CleanUp.png) ### 4.3 Handling Byzantine Failures