404
Page not found
That’s a Four-Oh-Four.
From 389b63f2f7a40f376b9c1fda92e110fc59ff9bd4 Mon Sep 17 00:00:00 2001 From: mario4tier <4542410+mario4tier@users.noreply.github.com> Date: Wed, 14 Feb 2024 03:11:53 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20ChainMov?= =?UTF-8?q?ers/dtp@06cbe609523dc1510749957198ccf7ab64f665aa=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 404.html | 41 +- assets/404.html-B7K0IBbl.js | 1 + assets/api_rust.html-BxLNqA0i.js | 1 + assets/api_rust.html-jEWBwXo5.js | 1 + assets/api_typescript.html-C6Hyg1mu.js | 1 + assets/api_typescript.html-DpDyABcd.js | 1 + assets/app-DlOHg9Xr.js | 30 + assets/design.html-BCNdCdft.js | 1 + assets/design.html-BzmiLaM4.js | 1 + assets/editors.html-DwjnlUpI.js | 7 + assets/faq.html-B9wOlu7B.js | 1 + assets/{images => }/favicon.png | Bin assets/full_setup.html-CCMysVzO.js | 38 + assets/future_work.html-BqJ-TElc.js | 1 + assets/future_work.html-iK8jJpLI.js | 1 + assets/icon/apple-icon-152.png | Bin 0 -> 3568 bytes assets/icon/chrome-192.png | Bin 0 -> 4733 bytes assets/icon/chrome-512.png | Bin 0 -> 13251 bytes assets/icon/chrome-mask-192.png | Bin 0 -> 4755 bytes assets/icon/chrome-mask-512.png | Bin 0 -> 13040 bytes assets/icon/guide-maskable.png | Bin 0 -> 2270 bytes assets/icon/ms-icon-144.png | Bin 0 -> 3657 bytes assets/image/advanced.svg | 1 + assets/image/blog.svg | 1 + assets/image/box.svg | 1 + assets/image/features.svg | 1 + assets/image/github-dark.svg | 1 + assets/image/github-light.svg | 1 + assets/image/layout.svg | 1 + assets/image/markdown.svg | 1 + assets/images/HomeStackArrowCapy.png | Bin assets/images/design_terms.png | Bin assets/images/example_rpc_firewall.png | Bin assets/images/example_web3.png | Bin assets/images/free_icon.svg | 1 + assets/images/home_high_level.png | Bin assets/images/home_top_capy.png | Bin assets/images/multi_channels.png | Bin assets/images/p2p_broadcast.png | Bin assets/images/propose-change.png | Bin 0 -> 10764 bytes assets/images/ref_broadcast.png | Bin assets/images/ref_firewall.png | Bin assets/images/ref_ha.png | Bin assets/images/ref_uni.png | Bin assets/images/setup_help_services.png | Bin assets/images/total_vs_partial_order.PNG | Bin .../images/total_vs_partial_order_small.PNG | Bin assets/index.html-2JbiJiHq.js | 1 + assets/index.html-BSnE9a5s.js | 1 + assets/index.html-BbkzL85r.js | 1 + assets/index.html-By-UCih8.js | 1 + assets/index.html-K9gGP3vT.js | 1 + assets/index.html-xbvo-U6r.js | 1 + assets/install.html-BizGowkj.js | 1 + assets/intro.html-DJw2Nump.js | 1 + assets/javascripts/bundle.b7178837.min.js | 3 - assets/javascripts/lunr/min/lunr.ar.min.js | 1 - assets/javascripts/lunr/min/lunr.da.min.js | 18 - assets/javascripts/lunr/min/lunr.de.min.js | 18 - assets/javascripts/lunr/min/lunr.du.min.js | 18 - assets/javascripts/lunr/min/lunr.es.min.js | 18 - assets/javascripts/lunr/min/lunr.fi.min.js | 18 - assets/javascripts/lunr/min/lunr.fr.min.js | 18 - assets/javascripts/lunr/min/lunr.hi.min.js | 1 - assets/javascripts/lunr/min/lunr.hu.min.js | 18 - assets/javascripts/lunr/min/lunr.it.min.js | 18 - assets/javascripts/lunr/min/lunr.ja.min.js | 1 - assets/javascripts/lunr/min/lunr.jp.min.js | 1 - assets/javascripts/lunr/min/lunr.ko.min.js | 1 - assets/javascripts/lunr/min/lunr.multi.min.js | 1 - assets/javascripts/lunr/min/lunr.nl.min.js | 18 - assets/javascripts/lunr/min/lunr.no.min.js | 18 - assets/javascripts/lunr/min/lunr.pt.min.js | 18 - assets/javascripts/lunr/min/lunr.ro.min.js | 18 - assets/javascripts/lunr/min/lunr.ru.min.js | 18 - .../lunr/min/lunr.stemmer.support.min.js | 1 - assets/javascripts/lunr/min/lunr.sv.min.js | 18 - assets/javascripts/lunr/min/lunr.ta.min.js | 1 - assets/javascripts/lunr/min/lunr.th.min.js | 1 - assets/javascripts/lunr/min/lunr.tr.min.js | 18 - assets/javascripts/lunr/min/lunr.vi.min.js | 1 - assets/javascripts/lunr/min/lunr.zh.min.js | 1 - assets/javascripts/lunr/tinyseg.js | 206 - assets/javascripts/lunr/wordcut.js | 6708 ----------------- .../workers/search.6c7302c4.min.js | 2 - assets/npm_only.html-Bs9x0lRw.js | 1 + assets/p2p_broadcast-DKREXEsi.js | 1 + assets/photoswipe.esm-SzV8tJDW.js | 4 + assets/plugin-vue_export-helper-DlAUqK2U.js | 1 + assets/ref_broadcast-Cg4jrlCe.js | 1 + assets/rpc_firewall.html-C8sUbYFf.js | 1 + assets/runtime_only.html-BsGx0Xbr.js | 1 + assets/scripts.html-Cae6ml7k.js | 1 + assets/scripts.html-D_w4s9EQ.js | 1 + assets/style-Ceu9ObI8.css | 1 + assets/stylesheets/main.e95b5de1.min.css | 1 - assets/stylesheets/palette.6932e648.min.css | 1 - assets/web3_rust.html-D5SN0Dc_.js | 1 + community/editors.html | 46 + community/index.html | 41 +- docs/api_rust.html | 40 + docs/api_typescript.html | 40 + docs/design.html | 40 + docs/future_work.html | 40 + docs/index.html | 40 + docs/scripts.html | 40 + example/rpc_firewall/index.html | 1 - example/web3_rust/index.html | 1 - examples/index.html | 41 +- examples/rpc_firewall.html | 40 + examples/web3_rust.html | 40 + faq.html | 40 + faq/index.html | 1 - favicon.ico | Bin 0 -> 67646 bytes how-to/full_setup.html | 77 + how-to/index.html | 40 + how-to/install.html | 40 + how-to/npm_only.html | 40 + how-to/runtime_only.html | 40 + index.html | 44 +- intro.html | 40 + assets/logo.png => logo.png | Bin logo.svg | 1 + overrides/partials/disable_copyright.html | 0 ref/api/index.html | 1 - ref/api_rust.html | 40 + ref/api_rust/index.html | 1 - ref/api_typescript.html | 40 + ref/api_typescript/index.html | 1 - ref/design.html | 40 + ref/design/index.html | 1 - ref/future_work.html | 40 + ref/future_work/index.html | 1 - ref/index.html | 40 + ref/readme/index.html | 1 - ref/scripts.html | 40 + ref/scripts/index.html | 1 - robots.txt | 5 + search/search_index.json | 1 - setup/help/index.html | 1 - setup/rust/index.html | 38 - setup/services/index.html | 1 - sitemap.xml | 84 +- sitemap.xml.gz | Bin 206 -> 0 bytes sitemap.xsl | 207 + 145 files changed, 1417 insertions(+), 7339 deletions(-) create mode 100644 assets/404.html-B7K0IBbl.js create mode 100644 assets/api_rust.html-BxLNqA0i.js create mode 100644 assets/api_rust.html-jEWBwXo5.js create mode 100644 assets/api_typescript.html-C6Hyg1mu.js create mode 100644 assets/api_typescript.html-DpDyABcd.js create mode 100644 assets/app-DlOHg9Xr.js create mode 100644 assets/design.html-BCNdCdft.js create mode 100644 assets/design.html-BzmiLaM4.js create mode 100644 assets/editors.html-DwjnlUpI.js create mode 100644 assets/faq.html-B9wOlu7B.js rename assets/{images => }/favicon.png (100%) mode change 100644 => 100755 create mode 100644 assets/full_setup.html-CCMysVzO.js create mode 100644 assets/future_work.html-BqJ-TElc.js create mode 100644 assets/future_work.html-iK8jJpLI.js create mode 100644 assets/icon/apple-icon-152.png create mode 100644 assets/icon/chrome-192.png create mode 100644 assets/icon/chrome-512.png create mode 100644 assets/icon/chrome-mask-192.png create mode 100644 assets/icon/chrome-mask-512.png create mode 100644 assets/icon/guide-maskable.png create mode 100644 assets/icon/ms-icon-144.png create mode 100644 assets/image/advanced.svg create mode 100644 assets/image/blog.svg create mode 100644 assets/image/box.svg create mode 100644 assets/image/features.svg create mode 100644 assets/image/github-dark.svg create mode 100644 assets/image/github-light.svg create mode 100644 assets/image/layout.svg create mode 100644 assets/image/markdown.svg mode change 100644 => 100755 assets/images/HomeStackArrowCapy.png mode change 100644 => 100755 assets/images/design_terms.png mode change 100644 => 100755 assets/images/example_rpc_firewall.png mode change 100644 => 100755 assets/images/example_web3.png create mode 100644 assets/images/free_icon.svg mode change 100644 => 100755 assets/images/home_high_level.png mode change 100644 => 100755 assets/images/home_top_capy.png mode change 100644 => 100755 assets/images/multi_channels.png mode change 100644 => 100755 assets/images/p2p_broadcast.png create mode 100755 assets/images/propose-change.png mode change 100644 => 100755 assets/images/ref_broadcast.png mode change 100644 => 100755 assets/images/ref_firewall.png mode change 100644 => 100755 assets/images/ref_ha.png mode change 100644 => 100755 assets/images/ref_uni.png mode change 100644 => 100755 assets/images/setup_help_services.png mode change 100644 => 100755 assets/images/total_vs_partial_order.PNG mode change 100644 => 100755 assets/images/total_vs_partial_order_small.PNG create mode 100644 assets/index.html-2JbiJiHq.js create mode 100644 assets/index.html-BSnE9a5s.js create mode 100644 assets/index.html-BbkzL85r.js create mode 100644 assets/index.html-By-UCih8.js create mode 100644 assets/index.html-K9gGP3vT.js create mode 100644 assets/index.html-xbvo-U6r.js create mode 100644 assets/install.html-BizGowkj.js create mode 100644 assets/intro.html-DJw2Nump.js delete mode 100644 assets/javascripts/bundle.b7178837.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.da.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.de.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.du.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.es.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.it.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.no.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.th.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js delete mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js delete mode 100644 assets/javascripts/lunr/tinyseg.js delete mode 100644 assets/javascripts/lunr/wordcut.js delete mode 100644 assets/javascripts/workers/search.6c7302c4.min.js create mode 100644 assets/npm_only.html-Bs9x0lRw.js create mode 100644 assets/p2p_broadcast-DKREXEsi.js create mode 100644 assets/photoswipe.esm-SzV8tJDW.js create mode 100644 assets/plugin-vue_export-helper-DlAUqK2U.js create mode 100644 assets/ref_broadcast-Cg4jrlCe.js create mode 100644 assets/rpc_firewall.html-C8sUbYFf.js create mode 100644 assets/runtime_only.html-BsGx0Xbr.js create mode 100644 assets/scripts.html-Cae6ml7k.js create mode 100644 assets/scripts.html-D_w4s9EQ.js create mode 100644 assets/style-Ceu9ObI8.css delete mode 100644 assets/stylesheets/main.e95b5de1.min.css delete mode 100644 assets/stylesheets/palette.6932e648.min.css create mode 100644 assets/web3_rust.html-D5SN0Dc_.js create mode 100644 community/editors.html create mode 100644 docs/api_rust.html create mode 100644 docs/api_typescript.html create mode 100644 docs/design.html create mode 100644 docs/future_work.html create mode 100644 docs/index.html create mode 100644 docs/scripts.html delete mode 100644 example/rpc_firewall/index.html delete mode 100644 example/web3_rust/index.html create mode 100644 examples/rpc_firewall.html create mode 100644 examples/web3_rust.html create mode 100644 faq.html delete mode 100644 faq/index.html create mode 100644 favicon.ico create mode 100644 how-to/full_setup.html create mode 100644 how-to/index.html create mode 100644 how-to/install.html create mode 100644 how-to/npm_only.html create mode 100644 how-to/runtime_only.html create mode 100644 intro.html rename assets/logo.png => logo.png (100%) mode change 100644 => 100755 create mode 100644 logo.svg delete mode 100644 overrides/partials/disable_copyright.html delete mode 100644 ref/api/index.html create mode 100644 ref/api_rust.html delete mode 100644 ref/api_rust/index.html create mode 100644 ref/api_typescript.html delete mode 100644 ref/api_typescript/index.html create mode 100644 ref/design.html delete mode 100644 ref/design/index.html create mode 100644 ref/future_work.html delete mode 100644 ref/future_work/index.html create mode 100644 ref/index.html delete mode 100644 ref/readme/index.html create mode 100644 ref/scripts.html delete mode 100644 ref/scripts/index.html create mode 100644 robots.txt delete mode 100644 search/search_index.json delete mode 100644 setup/help/index.html delete mode 100644 setup/rust/index.html delete mode 100644 setup/services/index.html delete mode 100644 sitemap.xml.gz create mode 100644 sitemap.xsl diff --git a/404.html b/404.html index 63b456d..4882e9f 100644 --- a/404.html +++ b/404.html @@ -1 +1,40 @@ -
Data Ingress: A data stream is sliced into transactions (txns) and added to the Sui network. The txns are targeted to a destination Pipe (owned object).
Data egress: The data "exit" the network through event streams (emitted by the txns being received at the destination Pipe). The transmitted data can be "observed" by any users, but decoded only by the ones having the decryption key.
The receiving end DTP SDK re-assembles the txns into the original data stream. The stream is then forwarded to the intended end-user (a TCP server, a Rust application layer above etc...).
Slower transactions (Sui consensus) are used for most "control plane" synchronizations.
Client: An application that initiate a connection.
Connection: One connection allows exchanging data between two applications. The applications are localized by their Host object on the Sui network. A connection will start to exchange data only after a Transport Control and one or two Pipe objects are created (for uni or bidirectional transfer respectively).
Host Object: Any signature authority that want to transfer data must create its own Host object. This is a Sui shared object involved in many control plane transactions (e.g. creation of a connection). It allows to configure the services (and SLA) that are to be provided, the lifecycle of its associated connections and control the firewall.
',9),x=e("strong",null,"Objects:",-1),P={href:"https://docs.sui.io/build/programming-with-objects",target:"_blank",rel:"noopener noreferrer"},D=n('Pipe Object:All off-chain data exchange involves an intermediate object on the Sui network. This object is the Pipe. It is owned by the sender of the data, and have its event stream observed by the receiver(s). A Pipe is loosely coupled to a Transport or Broadcast Control object for synchronization.
Server: Off-chain process intended to respond to client requests.
Service Level Agreement (SLA): Specify the costs, limitations and some behaviors for a service provided by a Host object. Example would be "sent data can be deleted from network storage after 48 hours (2 epochs)". The client signifies that it agrees to an SLA at the time the connection to the node is initiated. The SLA specs are such that DTP can enforce the agreement fairly to all parties.
Transport Control Object: Variables and state machines that exists for the lifetime of a single connection. This is a Sui shared object.
(1) Gas cost of processing incoming traffic is paid by the sender. That includes connection creation cost and running the firewall at the Pipe Object. Most abuse can therefore be neutralized without requiring any processing/cost from the Server.
Firewall functionality also includes back pressure management to minimize initiating/paying for transactions while the server is already known offline or too busy.
(2) Optionally, the DTP Node Host object gather statistics from all its Pipe objects and adjust the rate limiting rules. This may happen when the Server detects excessive incoming traffic. The gas cost for these likely rare adjustments is to be handled by the Server. (Note: This is a logical representation. More details will follow on how this is implemented such that Pipe objects are not involved with slower consensus transactions).
(3) The server configure the firewall and does a periodical heartbeat using its shared DTP Host object. The server may also do some fast detection and control on the firewall (TBD).
(4) When a transaction has no-effect because of the firewall, there is no event emitted (and sender is informed that the transaction was executed, but blocked by the firewall). Therefore, the Server is not impacted.
Media byte streams are ineviteably divided into transaction "block" at some point. Even with a fast finality, the bandwidth is limited by the maximum transaction size and their serialization as allowed by the L1 network (e.g. one simple transaction per object and gas coin at the time).
Therefore, to support high bandwidth, it might be needed to perform multiple transaction in parallel for a single connection transfer. These transaction flows through independent DTP channels.
Most of the complexity is handled off-chain by DTP when dividing and re-assembling the transactions into a data stream:
Will this be practical? There is a lot of cost/performance unknowns with both Sui network and DTP that will probably persist through 2023. DTP architecture supports media streaming, but it remains to be seen how practical it will be.
Gas might be expensive and there is some potential limitations about how much Sui fullnodes could scale on a viral broadcast (problem at egress of the network, not with the consensus performance itself).
Light data streaming (<20 Kbps) very likely to be supported and be useful within 2023.
Regardless of practicality, support for multi-channel will be at least useful for demo/stress load on a test network.
',20),j={href:"https://docs.google.com/spreadsheets/d/1zBrB1ifhPpnLlsDr6nBN_N55Kkw9hX06a7EVUpogyn4/edit?usp=sharing",target:"_blank",rel:"noopener noreferrer"},A=n('Off-chain servers can share the incoming load or be each other's fallback for high-availability.
Unlike traditional network, the data is not physically pushed toward a server. Instead, the data remains on the network and an event is emitted about who should "pull it".
It is an off-chain responsibility for the application to subscribe to their respective event stream (with proper identifier filtering) and normally retrieve only its assigned data (this change in some recovery scenario).
Configuration of the end-points and health of the servers is managed through the DTP node, which in turn updates all its pipes and transport control objects.
DTP will hide the high complexity of many race conditions (assignment to a server that died) and connection migrations among all end-points belonging to the same Node.
Similar to bi-directionals, but with a single Pipe object for data plane to minimize cost/complexity. Control plane still bi-directional (e.g. for encryption handshake).
Similar to unidirectional, but without encryption and using Broadcast objects instead of a Pipe&Transport control.
Broadcasters may require some different crypto-economic capability. Examples:
Data Ingress: A data stream is sliced into transactions (txns) and added to the Sui network. The txns are targeted to a destination Pipe (owned object).
Data egress: The data "exit" the network through event streams (emitted by the txns being received at the destination Pipe). The transmitted data can be "observed" by any users, but decoded only by the ones having the decryption key.
The receiving end DTP SDK re-assembles the txns into the original data stream. The stream is then forwarded to the intended end-user (a TCP server, a Rust application layer above etc...).
Slower transactions (Sui consensus) are used for most "control plane" synchronizations.
Client: An application that initiate a connection.
Connection: One connection allows exchanging data between two applications. The applications are localized by their Host object on the Sui network. A connection will start to exchange data only after a Transport Control and one or two Pipe objects are created (for uni or bidirectional transfer respectively).
Host Object: Any signature authority that want to transfer data must create its own Host object. This is a Sui shared object involved in many control plane transactions (e.g. creation of a connection). It allows to configure the services (and SLA) that are to be provided, the lifecycle of its associated connections and control the firewall.
',9),x=e("strong",null,"Objects:",-1),P={href:"https://docs.sui.io/build/programming-with-objects",target:"_blank",rel:"noopener noreferrer"},D=n('Pipe Object:All off-chain data exchange involves an intermediate object on the Sui network. This object is the Pipe. It is owned by the sender of the data, and have its event stream observed by the receiver(s). A Pipe is loosely coupled to a Transport or Broadcast Control object for synchronization.
Server: Off-chain process intended to respond to client requests.
Service Level Agreement (SLA): Specify the costs, limitations and some behaviors for a service provided by a Host object. Example would be "sent data can be deleted from network storage after 48 hours (2 epochs)". The client signifies that it agrees to an SLA at the time the connection to the node is initiated. The SLA specs are such that DTP can enforce the agreement fairly to all parties.
Transport Control Object: Variables and state machines that exists for the lifetime of a single connection. This is a Sui shared object.
(1) Gas cost of processing incoming traffic is paid by the sender. That includes connection creation cost and running the firewall at the Pipe Object. Most abuse can therefore be neutralized without requiring any processing/cost from the Server.
Firewall functionality also includes back pressure management to minimize initiating/paying for transactions while the server is already known offline or too busy.
(2) Optionally, the DTP Node Host object gather statistics from all its Pipe objects and adjust the rate limiting rules. This may happen when the Server detects excessive incoming traffic. The gas cost for these likely rare adjustments is to be handled by the Server. (Note: This is a logical representation. More details will follow on how this is implemented such that Pipe objects are not involved with slower consensus transactions).
(3) The server configure the firewall and does a periodical heartbeat using its shared DTP Host object. The server may also do some fast detection and control on the firewall (TBD).
(4) When a transaction has no-effect because of the firewall, there is no event emitted (and sender is informed that the transaction was executed, but blocked by the firewall). Therefore, the Server is not impacted.
Media byte streams are ineviteably divided into transaction "block" at some point. Even with a fast finality, the bandwidth is limited by the maximum transaction size and their serialization as allowed by the L1 network (e.g. one simple transaction per object and gas coin at the time).
Therefore, to support high bandwidth, it might be needed to perform multiple transaction in parallel for a single connection transfer. These transaction flows through independent DTP channels.
Most of the complexity is handled off-chain by DTP when dividing and re-assembling the transactions into a data stream:
Will this be practical? There is a lot of cost/performance unknowns with both Sui network and DTP that will probably persist through 2023. DTP architecture supports media streaming, but it remains to be seen how practical it will be.
Gas might be expensive and there is some potential limitations about how much Sui fullnodes could scale on a viral broadcast (problem at egress of the network, not with the consensus performance itself).
Light data streaming (<20 Kbps) very likely to be supported and be useful within 2023.
Regardless of practicality, support for multi-channel will be at least useful for demo/stress load on a test network.
',20),j={href:"https://docs.google.com/spreadsheets/d/1zBrB1ifhPpnLlsDr6nBN_N55Kkw9hX06a7EVUpogyn4/edit?usp=sharing",target:"_blank",rel:"noopener noreferrer"},A=n('Off-chain servers can share the incoming load or be each other's fallback for high-availability.
Unlike traditional network, the data is not physically pushed toward a server. Instead, the data remains on the network and an event is emitted about who should "pull it".
It is an off-chain responsibility for the application to subscribe to their respective event stream (with proper identifier filtering) and normally retrieve only its assigned data (this change in some recovery scenario).
Configuration of the end-points and health of the servers is managed through the DTP node, which in turn updates all its pipes and transport control objects.
DTP will hide the high complexity of many race conditions (assignment to a server that died) and connection migrations among all end-points belonging to the same Node.
Similar to bi-directionals, but with a single Pipe object for data plane to minimize cost/complexity. Control plane still bi-directional (e.g. for encryption handshake).
Similar to unidirectional, but without encryption and using Broadcast objects instead of a Pipe&Transport control.
Broadcasters may require some different crypto-economic capability. Examples:
Open the editor with the "Edit this pages on Github" link at the bottom.
When ready to propose your changes just select "Create a new branch" and give it a name:
Your proposed changes will be merged after review.
If you prefer to preview exactly your change, then you need to run vuepress on your machine and modify the markdown files with an editor (e.g. VSCode).
Prerequisites:
',7),m={href:"https://nodejs.dev/en/learn/how-to-install-nodejs/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://pnpm.io/installation",target:"_blank",rel:"noopener noreferrer"},b={href:"https://dtp.dev/how-to/install",target:"_blank",rel:"noopener noreferrer"},f=a(`For the one-time vuepress installation do:
$ cd ~/suibase/workdirs/common/extensions/dtp/docs
+$ pnpm install
+
To start vuepress (the server) do:
$ cd ~/suibase/workdirs/common/extensions/dtp/docs
+$ pnpm start
+...
+Open your browser at http://localhost:8080
+
The browser updates as you change files under docs/src
`,5),v={href:"https://theme-hope.vuejs.press/guide/",target:"_blank",rel:"noopener noreferrer"},y=t("p",null,"Submit your changes as a pull request, just ask as needed (not as hard as it seems once you do it once).",-1);function _(w,k){const n=s("ExternalLinkIcon");return r(),d("div",null,[p,t("p",null,[e("The website is built from markdown files (.md) and served directly from "),t("a",h,[e("github"),o(n)]),e(".")]),u,t("ul",null,[t("li",null,[e("NodeJS (>= 16.4) ( "),t("a",m,[e("https://nodejs.dev/en/learn/how-to-install-nodejs/"),o(n)]),e(" )")]),t("li",null,[e("pnpm ( "),t("a",g,[e("https://pnpm.io/installation"),o(n)]),e(" )")]),t("li",null,[e("DTP and Suibase ( "),t("a",b,[e("https://dtp.dev/how-to/install"),o(n)]),e(" )")])]),f,t("p",null,[e("See "),t("a",v,[e("https://theme-hope.vuejs.press/guide/"),o(n)]),e(" for advanced markdown features.")]),y])}const T=i(l,[["render",_],["__file","editors.html.vue"]]),E=JSON.parse('{"path":"/community/editors.html","title":"How to propose fix/change to the website?","lang":"en-US","frontmatter":{"title":"How to propose fix/change to the website?","order":2,"headerDepth":0,"contributors":true,"editLink":true,"description":"Anyone with a Github account can participate. The website is built from markdown files (.md) and served directly from github. Editing on Github (recommended for easy/quick chang...","head":[["meta",{"property":"og:url","content":"https://dtp.dev/community/editors.html"}],["meta",{"property":"og:site_name","content":"Decentralized Transport Protocol"}],["meta",{"property":"og:title","content":"How to propose fix/change to the website?"}],["meta",{"property":"og:description","content":"Anyone with a Github account can participate. The website is built from markdown files (.md) and served directly from github. Editing on Github (recommended for easy/quick chang..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-02-14T03:11:10.000Z"}],["meta",{"property":"article:author","content":"dtp.dev"}],["meta",{"property":"article:modified_time","content":"2024-02-14T03:11:10.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"How to propose fix/change to the website?\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2024-02-14T03:11:10.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"dtp.dev\\",\\"url\\":\\"https://dtp.dev\\"}]}"]]},"headers":[{"level":2,"title":"Editing on Github (recommended for easy/quick changes)","slug":"editing-on-github-recommended-for-easy-quick-changes","link":"#editing-on-github-recommended-for-easy-quick-changes","children":[]},{"level":2,"title":"Editing the website on your machine (advanced contributors)","slug":"editing-the-website-on-your-machine-advanced-contributors","link":"#editing-the-website-on-your-machine-advanced-contributors","children":[]}],"git":{"createdTime":1707880270000,"updatedTime":1707880270000,"contributors":[{"name":"mario4tier","email":"mario4tier@users.noreply.github.com","commits":1}]},"readingTime":{"minutes":0.77,"words":232},"filePathRelative":"community/editors.md","localizedDate":"February 14, 2024","autoDesc":true}');export{T as comp,E as data}; diff --git a/assets/faq.html-B9wOlu7B.js b/assets/faq.html-B9wOlu7B.js new file mode 100644 index 0000000..df40e5a --- /dev/null +++ b/assets/faq.html-B9wOlu7B.js @@ -0,0 +1 @@ +import{_ as c}from"./plugin-vue_export-helper-DlAUqK2U.js";import{r as i,o as p,c as l,a as e,b as t,d as n,w as s,e as r}from"./app-DlOHg9Xr.js";const d={},h=r('In one sentence... What can DTP do?
It is a TCP-Like protocol facilitating data transfer between web2 applications, with additional Web3 features such as services monetization, anonymity and security.
Can DTP be used between Web3 apps?
DTP can selectively connect front-ends WebApp to each other, while keeping the data transfer under the control of a dApps (transit on the Sui network).
As an example, you can use it to allow gamers safely exchange encrypted messages among themselves while they are on the same team in a Web3 game. In this case, DTP provides the WebApp to WebApp connectivity without making the players IP addresses visible.
What sort of data can DTP transport?
Any protocol, any data stream.
',8),m=r('Can DTP be used with commercial application?
Yes. DTP is open-source and can freely be used in commercial application (Apache 2.0 License).
How much does it cost to use DTP?
Only the Sui gas needed to run it, expect the execution cost to be mostly driven by the number of bytes transferred.
There is no developer fee or middlemen commission collected for using DTP.
When will DTP have token?
Never.
dApps built on top of DTP can use tokens or charge additional Mist, but this is not within the scope of DTP itself.
Can DTP simply tunnel standard TCP, UDP, IP packets?
Transparent packets tunneling could be done, but it is not recommended.
DTP/Sui provides already reliable and ordered data transport. That would be redundant with say, what TCP would try to achieve within a tunnel.
',11),u=e("p",null,[e("strong",null,"Any plan to support another blockchain?")],-1),f=e("p",null,"No, unless a breakthrough in performance is possible with another blockchain architecture.",-1),b=e("p",null,"Sui provides stable time to finality (low jitter), parallelism and scalability (no contention between connections).",-1),g=e("p",null,"Low jitter allows small and predictable buffer size at the receivers.",-1),y=e("p",null,"Sui simple transactions makes sub-second streaming latency possible.",-1),_=e("p",null,"For now, DTP/Sui might not be well-suited for application that depends on fast sequence of query/response (since that requires two transactions finality). DTP attempts to minimize roundtrips and protocol handshakes at every step.",-1),w=e("p",null,[e("strong",null,"Where is the code?")],-1),T={href:"https://github.com/mario4tier/dtp",target:"_blank",rel:"noopener noreferrer"},v=e("p",null,[e("strong",null,"Where can I go for more questions?")],-1),P={href:"https://discord.gg/Erb6SwsVbH",target:"_blank",rel:"noopener noreferrer"};function k(D,A){const o=i("RouteLink"),a=i("ExternalLinkIcon");return p(),l("div",null,[h,e("p",null,[t("Data can be a few bytes for a one time secret exchange for authentication/login. At another extreme, the bandwidth can be for as much as an encrypted video stream (through the innovative combination of "),n(o,{to:"/docs/design.html#multi-channel-connection"},{default:s(()=>[t("DTP Multi-channels")]),_:1}),t(" and Sui network simple transactions). The economic feasibility of HD video streaming on blockchain is an open question...")]),m,e("p",null,[t("Instead, look into "),n(o,{to:"/how-to/install.html#choice-1-of-3-simplified-dtp-services-deployment"},{default:s(()=>[t("DTP Services Daemon")]),_:1}),t(" to efficiently terminate/bridge standard IP protocols. That eliminates protocol redundancy and better leverage what the Sui network already provide.")]),u,f,b,g,y,_,w,e("p",null,[t("DTP still in early design phase and is not yet release. See "),e("a",T,[t("GitHub"),n(a)]),t(' development branches for "work-in-progress".')]),v,e("p",null,[t("Try the Discord channel: "),e("a",P,[t("https://discord.gg/Erb6SwsVbH"),n(a)])])])}const I=c(d,[["render",k],["__file","faq.html.vue"]]),W=JSON.parse('{"path":"/faq.html","title":"FAQ","lang":"en-US","frontmatter":{"editLink":true,"description":"FAQ In one sentence... What can DTP do? It is a TCP-Like protocol facilitating data transfer between web2 applications, with additional Web3 features such as services monetizati...","head":[["meta",{"property":"og:url","content":"https://dtp.dev/faq.html"}],["meta",{"property":"og:site_name","content":"Decentralized Transport Protocol"}],["meta",{"property":"og:title","content":"FAQ"}],["meta",{"property":"og:description","content":"FAQ In one sentence... What can DTP do? It is a TCP-Like protocol facilitating data transfer between web2 applications, with additional Web3 features such as services monetizati..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-02-14T03:11:10.000Z"}],["meta",{"property":"article:author","content":"dtp.dev"}],["meta",{"property":"article:modified_time","content":"2024-02-14T03:11:10.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"FAQ\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2024-02-14T03:11:10.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"dtp.dev\\",\\"url\\":\\"https://dtp.dev\\"}]}"]]},"headers":[],"git":{"createdTime":1707880270000,"updatedTime":1707880270000,"contributors":[{"name":"mario4tier","email":"mario4tier@users.noreply.github.com","commits":1}]},"readingTime":{"minutes":1.62,"words":487},"filePathRelative":"faq.md","localizedDate":"February 14, 2024","autoDesc":true}');export{I as comp,W as data}; diff --git a/assets/images/favicon.png b/assets/favicon.png old mode 100644 new mode 100755 similarity index 100% rename from assets/images/favicon.png rename to assets/favicon.png diff --git a/assets/full_setup.html-CCMysVzO.js b/assets/full_setup.html-CCMysVzO.js new file mode 100644 index 0000000..269fefb --- /dev/null +++ b/assets/full_setup.html-CCMysVzO.js @@ -0,0 +1,38 @@ +import{_ as l}from"./plugin-vue_export-helper-DlAUqK2U.js";import{r as a,o as s,c as o,a as e,b as n,d as i,e as d}from"./app-DlOHg9Xr.js";const r={},c=e("h1",{id:"rust-development-setup-installation",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rust-development-setup-installation"},[e("span",null,"Rust Development Setup Installation")])],-1),u=e("h3",{id:"follow-the-sui-installation",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#follow-the-sui-installation"},[e("span",null,"Follow the Sui installation")])],-1),p={href:"https://docs.sui.io/build/install#prerequisites",target:"_blank",rel:"noopener noreferrer"},m=e("h3",{id:"clone-dtp",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#clone-dtp"},[e("span",null,"Clone DTP")])],-1),h={href:"https://github.com/mario4tier/dtp",target:"_blank",rel:"noopener noreferrer"},v=d(`Just run the DTP "init-localnet" and it will initialize the whole DTP setup and (re)start the "sui" localnet process as needed.
The localnet will be re-initialized with always the same configuration, address and funding. (it uses its own configuration file at genesis for a deterministic setup).
From this point use "lsui" and "dsui" shell scripts (as a direct replacement of "sui") to access localnet and devnet respectively.
Output example:
~/dtp$ ./dtp/script/init-localnet
+Output location = /home/user/dtp-dev
+Stopping running localnet (sui process pid 1317)
+Building localnet using latest Sui devnet branch...
+ Finished dev [unoptimized + debuginfo] target(s) in 1.29s
+Removing existing /home/user/dtp-dev/localnet directory
+Starting new localnet process (may take up to 30 secs)
+.........
+New localnet started (sui 0.20.0, process pid 6798)
+========
+localnet => http://0.0.0.0:9000 (active)
+devnet => https://fullnode.devnet.sui.io:443
+========
+All addresses with coins:
+Showing 5 results.
+0x267d4904898cbc15f165a18541154ec8c5732fcb
+0x68db58b41d97e4cf1ea7d9327036ebd306a7930a
+0x99d821380348ee02dd685a3af6d7123d92db0d3c
+0xbbd8d0695c369b04e9207fca4ef9f5f15b2c0de7
+0xe7f134729591f52cf0638c2500a7ed228033a9e7
+========
+All coins owned by 0xe7f134729591f52cf0638c2500a7ed228033a9e7 (active):
+ Object ID | Gas Value
+----------------------------------------------------------------------
+ 0x0b162ef4f83118cc0ad811de35ed330ec3441d7b | 100000000000000
+ 0x2d43245a6af1f65847f7c18d5f6aabbd8e11299b | 100000000000000
+ 0x9811c29f1dadb67aadcd59c75693b4a91b347fbb | 100000000000000
+ 0xc8381677d3c213f9b0e9ef3d2d14051458b6af8a | 100000000000000
+ 0xd0b2b2227244707bce233d13bf537af7a6710c01 | 100000000000000
+========
+
+Remember:
+ Use "dsui" to access devnet
+ Use "lsui" to access your localnet
+
+Success. Try it by typing "lsui client gas"
+host:~/$
+
~/dtp$ publish-localnet
~/dtp$ cargo test
When running integration tests, the test setup makes sure a localnet (sui process) and a peer DTP service Daemon (dtp process) simulate interacting with a remote peer.
This allows to automate your own client/server integration test of your own application on a single machine (Just need to make sure to use a different set of object coin, client address and localhost:port. More on this later).
`,12);function b(f,g){const t=a("ExternalLinkIcon");return s(),o("div",null,[c,u,e("p",null,[e("a",p,[n("https://docs.sui.io/build/install#prerequisites"),i(t)])]),m,e("p",null,[e("a",h,[n("https://github.com/mario4tier/dtp"),i(t)])]),v])}const w=l(r,[["render",b],["__file","full_setup.html.vue"]]),y=JSON.parse('{"path":"/how-to/full_setup.html","title":"Rust Development Setup Installation","lang":"en-US","frontmatter":{"editLink":true,"description":"Rust Development Setup Installation Follow the Sui installation https://docs.sui.io/build/install#prerequisites Clone DTP https://github.com/mario4tier/dtp Initialize localnet J...","head":[["meta",{"property":"og:url","content":"https://dtp.dev/how-to/full_setup.html"}],["meta",{"property":"og:site_name","content":"Decentralized Transport Protocol"}],["meta",{"property":"og:title","content":"Rust Development Setup Installation"}],["meta",{"property":"og:description","content":"Rust Development Setup Installation Follow the Sui installation https://docs.sui.io/build/install#prerequisites Clone DTP https://github.com/mario4tier/dtp Initialize localnet J..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-02-14T03:11:10.000Z"}],["meta",{"property":"article:author","content":"dtp.dev"}],["meta",{"property":"article:modified_time","content":"2024-02-14T03:11:10.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Rust Development Setup Installation\\",\\"image\\":[\\"\\"],\\"dateModified\\":\\"2024-02-14T03:11:10.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"dtp.dev\\",\\"url\\":\\"https://dtp.dev\\"}]}"]]},"headers":[{"level":3,"title":"Follow the Sui installation","slug":"follow-the-sui-installation","link":"#follow-the-sui-installation","children":[]},{"level":3,"title":"Clone DTP","slug":"clone-dtp","link":"#clone-dtp","children":[]},{"level":3,"title":"Initialize localnet","slug":"initialize-localnet","link":"#initialize-localnet","children":[]},{"level":3,"title":"Publish DTP Package (localnet)","slug":"publish-dtp-package-localnet","link":"#publish-dtp-package-localnet","children":[]},{"level":3,"title":"Run DTP Integration Test (localnet)","slug":"run-dtp-integration-test-localnet","link":"#run-dtp-integration-test-localnet","children":[]}],"git":{"createdTime":1707880270000,"updatedTime":1707880270000,"contributors":[{"name":"mario4tier","email":"mario4tier@users.noreply.github.com","commits":1}]},"readingTime":{"minutes":0.97,"words":291},"filePathRelative":"how-to/full_setup.md","localizedDate":"February 14, 2024","autoDesc":true}');export{w as comp,y as data}; diff --git a/assets/future_work.html-BqJ-TElc.js b/assets/future_work.html-BqJ-TElc.js new file mode 100644 index 0000000..ad59cf7 --- /dev/null +++ b/assets/future_work.html-BqJ-TElc.js @@ -0,0 +1 @@ +import{_ as n}from"./p2p_broadcast-DKREXEsi.js";import{_ as r}from"./plugin-vue_export-helper-DlAUqK2U.js";import{r as i,o as s,c,a as e,b as t,d as a,e as d}from"./app-DlOHg9Xr.js";const l={},p=d('Data broadcasting will put pressure on fullnodes WebSocket event streaming services.
Fullnodes may have low economic incentive to support such high bandwidth services.
The architecture should scale to match the audience size.
Consequently, one possible long term solution is for DTP/Sui to provide only the crypto-economic services and then leave the burden of broadcasting to a public peer-to-peer network.
Each peer is running a DTP app for direct connection to the Sui network (for control plane). The complexity of the data plane transiting through a peer-to-peer network should be hidden to the end-users (Peers).
The use of P2P or not remains irrelevant to the broadcaster which always interface directly to the Sui network.
Once the data is confirmed consumed by the receiver(s), then it can be deleted on the L1 network to recover some storage fee --> Revisit the design needed here once Sui implements Storage fund.
The sender of the data can opt out from automated deletion and assume the full storage cost.
Automated deletion is controlled by DTP to provide a fair time for the receiver(s) to consume the data and can be fine tuned through the sender service level agreement (SLA).
The SLAs are published by the server (in its Node object) and one is selected by the client at the time of the connection being established.
TCP protocol includes acknowledgment of L4 delivery to the destination, but without guarantee of being consumed by the application (requires additional protocol at layer 7).
DTP layer supports both; a confirmation of the data being available on the L1 network (TCP delivery equivalent) and optional confirmation of the client consuming the data (L7 protocol equivalent).
Example of use would be to integrate in the dApps the verification that the data was persisted off-chain by the destination. There is no verification that the destination is honest, but this would be used in context where it would be in the destination best interest to act honestly.
For now, broadcast are assumed to be always public and non-encrypted.
Allowing encryption may allow alternative economic model (similar to cable and/or streaming subscription services[^1]), but this is challenging and piracy can (at best) only be mitigated[^2].
Only the user with the decryption key would be able to make sense of the data. More research to be done about how DTP could implement this feature.
',22),h={href:"https://en.wikipedia.org/wiki/Broadcast_encryption",target:"_blank",rel:"noopener noreferrer"},u={href:"https://en.wikipedia.org/wiki/Multicast_encryption",target:"_blank",rel:"noopener noreferrer"};function m(g,b){const o=i("ExternalLinkIcon");return s(),c("div",null,[p,e("p",null,[t("[^1]: Wikipedia "),e("a",h,[t("Broadcast Encryption"),a(o)])]),e("p",null,[t("[^2]: Wikipedia "),e("a",u,[t("Multicast Encryption"),a(o)])])])}const k=r(l,[["render",m],["__file","future_work.html.vue"]]),w=JSON.parse('{"path":"/docs/future_work.html","title":"Future Work","lang":"en-US","frontmatter":{"editLink":true,"description":"Future Work Broadcasting Challenges Data broadcasting will put pressure on fullnodes WebSocket event streaming services. Fullnodes may have low economic incentive to support suc...","head":[["meta",{"property":"og:url","content":"https://dtp.dev/docs/future_work.html"}],["meta",{"property":"og:site_name","content":"Decentralized Transport Protocol"}],["meta",{"property":"og:title","content":"Future Work"}],["meta",{"property":"og:description","content":"Future Work Broadcasting Challenges Data broadcasting will put pressure on fullnodes WebSocket event streaming services. Fullnodes may have low economic incentive to support suc..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://dtp.dev/assets/images/p2p_broadcast.png?url"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"property":"og:updated_time","content":"2024-02-14T03:11:10.000Z"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Future Work"}],["meta",{"property":"article:author","content":"dtp.dev"}],["meta",{"property":"article:modified_time","content":"2024-02-14T03:11:10.000Z"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Future Work\\",\\"image\\":[\\"https://dtp.dev/assets/images/p2p_broadcast.png?url\\"],\\"dateModified\\":\\"2024-02-14T03:11:10.000Z\\",\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"dtp.dev\\",\\"url\\":\\"https://dtp.dev\\"}]}"]]},"headers":[{"level":2,"title":"Broadcasting Challenges","slug":"broadcasting-challenges","link":"#broadcasting-challenges","children":[]},{"level":2,"title":"Data Deletion","slug":"data-deletion","link":"#data-deletion","children":[]},{"level":2,"title":"Data Consumption Confirmation","slug":"data-consumption-confirmation","link":"#data-consumption-confirmation","children":[]},{"level":2,"title":"Encrypted Broadcasting","slug":"encrypted-broadcasting","link":"#encrypted-broadcasting","children":[]}],"git":{"createdTime":1707880270000,"updatedTime":1707880270000,"contributors":[{"name":"mario4tier","email":"mario4tier@users.noreply.github.com","commits":1}]},"readingTime":{"minutes":1.45,"words":436},"filePathRelative":"docs/future_work.md","localizedDate":"February 14, 2024","autoDesc":true}');export{k as comp,w as data}; diff --git a/assets/future_work.html-iK8jJpLI.js b/assets/future_work.html-iK8jJpLI.js new file mode 100644 index 0000000..eafb918 --- /dev/null +++ b/assets/future_work.html-iK8jJpLI.js @@ -0,0 +1 @@ +import{_ as n}from"./p2p_broadcast-DKREXEsi.js";import{_ as r}from"./plugin-vue_export-helper-DlAUqK2U.js";import{r as i,o as s,c,a as e,b as t,d as o,e as l}from"./app-DlOHg9Xr.js";const d={},p=l('Data broadcasting will put pressure on fullnodes WebSocket event streaming services.
Fullnodes may have low economic incentive to support such high bandwidth services.
The architecture should scale to match the audience size.
Consequently, one possible long term solution is for DTP/Sui to provide only the crypto-economic services and then leave the burden of broadcasting to a public peer-to-peer network.
Each peer is running a DTP app for direct connection to the Sui network (for control plane). The complexity of the data plane transiting through a peer-to-peer network should be hidden to the end-users (Peers).
The use of P2P or not remains irrelevant to the broadcaster which always interface directly to the Sui network.
Once the data is confirmed consumed by the receiver(s), then it can be deleted on the L1 network to recover some storage fee --> Revisit the design needed here once Sui implements Storage fund.
The sender of the data can opt out from automated deletion and assume the full storage cost.
Automated deletion is controlled by DTP to provide a fair time for the receiver(s) to consume the data and can be fine tuned through the sender service level agreement (SLA).
The SLAs are published by the server (in its Node object) and one is selected by the client at the time of the connection being established.
TCP protocol includes acknowledgment of L4 delivery to the destination, but without guarantee of being consumed by the application (requires additional protocol at layer 7).
DTP layer supports both; a confirmation of the data being available on the L1 network (TCP delivery equivalent) and optional confirmation of the client consuming the data (L7 protocol equivalent).
Example of use would be to integrate in the dApps the verification that the data was persisted off-chain by the destination. There is no verification that the destination is honest, but this would be used in context where it would be in the destination best interest to act honestly.
For now, broadcast are assumed to be always public and non-encrypted.
Allowing encryption may allow alternative economic model (similar to cable and/or streaming subscription services[^1]), but this is challenging and piracy can (at best) only be mitigated[^2].
Only the user with the decryption key would be able to make sense of the data. More research to be done about how DTP could implement this feature.
',22),h={href:"https://en.wikipedia.org/wiki/Broadcast_encryption",target:"_blank",rel:"noopener noreferrer"},u={href:"https://en.wikipedia.org/wiki/Multicast_encryption",target:"_blank",rel:"noopener noreferrer"};function m(g,f){const a=i("ExternalLinkIcon");return s(),c("div",null,[p,e("p",null,[t("[^1]: Wikipedia "),e("a",h,[t("Broadcast Encryption"),o(a)])]),e("p",null,[t("[^2]: Wikipedia "),e("a",u,[t("Multicast Encryption"),o(a)])])])}const k=r(d,[["render",m],["__file","future_work.html.vue"]]),w=JSON.parse('{"path":"/ref/future_work.html","title":"Future Work","lang":"en-US","frontmatter":{"editLink":true,"description":"Future Work Broadcasting Challenges Data broadcasting will put pressure on fullnodes WebSocket event streaming services. Fullnodes may have low economic incentive to support suc...","head":[["meta",{"property":"og:url","content":"https://dtp.dev/ref/future_work.html"}],["meta",{"property":"og:site_name","content":"Decentralized Transport Protocol"}],["meta",{"property":"og:title","content":"Future Work"}],["meta",{"property":"og:description","content":"Future Work Broadcasting Challenges Data broadcasting will put pressure on fullnodes WebSocket event streaming services. Fullnodes may have low economic incentive to support suc..."}],["meta",{"property":"og:type","content":"article"}],["meta",{"property":"og:image","content":"https://dtp.dev/assets/images/p2p_broadcast.png?url"}],["meta",{"property":"og:locale","content":"en-US"}],["meta",{"name":"twitter:card","content":"summary_large_image"}],["meta",{"name":"twitter:image:alt","content":"Future Work"}],["meta",{"property":"article:author","content":"dtp.dev"}],["script",{"type":"application/ld+json"},"{\\"@context\\":\\"https://schema.org\\",\\"@type\\":\\"Article\\",\\"headline\\":\\"Future Work\\",\\"image\\":[\\"https://dtp.dev/assets/images/p2p_broadcast.png?url\\"],\\"dateModified\\":null,\\"author\\":[{\\"@type\\":\\"Person\\",\\"name\\":\\"dtp.dev\\",\\"url\\":\\"https://dtp.dev\\"}]}"]]},"headers":[{"level":2,"title":"Broadcasting Challenges","slug":"broadcasting-challenges","link":"#broadcasting-challenges","children":[]},{"level":2,"title":"Data Deletion","slug":"data-deletion","link":"#data-deletion","children":[]},{"level":2,"title":"Data Consumption Confirmation","slug":"data-consumption-confirmation","link":"#data-consumption-confirmation","children":[]},{"level":2,"title":"Encrypted Broadcasting","slug":"encrypted-broadcasting","link":"#encrypted-broadcasting","children":[]}],"git":{"createdTime":null,"updatedTime":null,"contributors":[]},"readingTime":{"minutes":1.45,"words":436},"filePathRelative":"ref/future_work.md","autoDesc":true}');export{k as comp,w as data}; diff --git a/assets/icon/apple-icon-152.png b/assets/icon/apple-icon-152.png new file mode 100644 index 0000000000000000000000000000000000000000..434fcc3d5cdd2a03b4c4e41e915bf715f00127d7 GIT binary patch literal 3568 zcmZ`+2{aU5`yTr)F_ttTTei_yqLJ(jMo7rMWEWuugY2>CxPT=u?nq)27eij1FeLv z0Hlr35yV$~);(a8DPqGKTn9F!S8}eGwAC{_kXR6)C4Nzjo&y#s1N!%TAwPt9G12%Z ziFW3QES3=`^KX5t9GK;#zV*!z#-H3xc_KG8tJ*rQyKRHZ?yCSgNyZAN*UA5ak<`us zHR{|0<(|$@MiY}=@v-*~H@&pI1Gk-~EgCYOZ|Bg2mF)b2__4B-vUR8PB>yeD8zkg%5vs6 zX^DULd1qcp^fTul%;ZTiRvh5yp=}tJHN@E(tk}Sx^0E3cyS98b+r95<;bkl01SrT- zK*qr h|?-k(-^->hJj>Zdoj4l_`S=EJ^XpQ(6u=|eC$!3S)mICBbozTPu}Hq zl2b)c3 =41N=3( 13ffPy%a`hAkcEi34_p*I>N2EVk-eBJhs|dh;c=x z%|~Pc5Hy=Eb=)H33X(=L6c7{-xUcZyp>j>m*D4-N9t3xmaU3o7YF}^!oV7^qj8Rc4 zk;@SH#ujg0^Ff|O^QzG!hE4DOrR2DR XmlnIpt|va@*t>T4t}{If^o5Oh x-Ka51(D`31qVV@Ey!yI|1+YU1A{2}aSv zazYMCb7{D$V_uJOhl)o4OF(aR9xw20f((obGRzzjxE&?uGqp&c)<4e_%k}$Xx|@68 zW(Tl(ePSCaqo#Wv3DT_=(FCN^f^2lA%tCH!&ha&m#G|g0P$|I|NrZ740>6GLiiX6` zJ@fY8?KtFE;63S%IB97qm6HgF37B|(dWsJ1h`)JIZA2ztccFm~2ssOAJZ3HZTV98z z2W!xp4f<|+nt=}X`;~2}9v-Q)3NVWQ+dcaKFV0`JOg=@vO&6TXT3-kD&*7 }m7F z6Cq{ofdC&6VIg550U>dLyAlRM!cwC5r0$CG2? i*yX_(wl(v zX6Pk!q=oLE`|f)Gy6<22{cC2vJ@cKtznL@Z%-MTRq_(E=UGm4|007{w3K*n|w}1S3 zkP_e#({ibeH$>JiHC_S$m9e+4%!%>Wj22*B4FJHK4FLEU0svg#sgGCyz>OaO*m?s1 zNPY$YXq %71>ki1n>1_6Hkxn(sMBme+Z#VVke`ku49>DyY=Gju(dw+<#fnl|a6 z$BGGT3Bn%)Q$i?#3aKRWsqy)F8j+OXKqolyY<^i`Nx6rmp=FW*r2N5qH4|;B2WCc= z6N*%h4W3B2sbuqL-#+nH)qws`+xZN9n0*74y&{pBk+J_xV)%d-a7OO=oftq$^il3F z01*7fNck81n<6Cw{F@^9?QgFCjsHgpyx2eT|1AACR|4lKF|5h450YS>RaXACClb5X z)rIOpt$mtXjz{K;`I)P!4Zzh38ERHL&iJ@5nql92%o)O%xdNRyzEn9Mg)2Zaht $hGN6`j(+Gj6SJt1ifjZ`nXbV+y~byR22 z?Dxx`+E7H&9oawGpGX%Fr4EfZGvLJSAYT7~pSAWL?=&2(QyD&?CB22a8iBlkHSKI^ z(bd?>Zu34hglrzw7(@lBe$AIJ=S13a9g-JU-DfQ`I}N$dK~F~KD0=jy7KkJ(^7@uT zk{+i`I(8_u}Q`h~8iW5_IWHymnFqqUcv9WhGzMukEx@YVvPUXkEc2C-ssWJ`ooe zNq$@L?BWh6(>ZuufDE@q6k;mJIVsx0f=slTZ}G{DBM`WA^xpl|xHXHJRlns-gBQ1c zY-H~k<)$i=-pLwUzjnT=3xoQyA13`8=^0dd_m?=LhzX2pD2{M3i7WqM`OM6!a^M(t z^T5yy*VbCvRP*|WH3%!lHDk%>G7jnv_(k*LC8VNSwvuLqeP8k{=2fS8) 6{L+pqvKiS-b?XUbZizino@>70H{Yab!mlS!7hQ@K zVo$rOqcqSb>B&m{6J2x7P{~SS@BQ@Qtp!%+l(>s_`|Jzu!lxvlj1ugGg@vHGUO?=>^Stw{M0}IvnsMd{BnHX@7#cF$7tU?4k zJ$qJ`^c$c00h!WHwi| 3?EP{Ff@X@n6XV3p7sm-UQ;nI? zPSY0Q4s)Zw*Mb+skcy@{H8+>Z&xeYtuV^X46J9bpem8`zaReT^-gs%2^Sr!zwnCO? zJ!k*A }KDB6nEZKV;@JoHMRQb9}WTLd*+AUCA z;GD(FfhDG?DYg=LXw(vd2H0QQ+(%CQclSZt-20 zvUP0r?=?^+Hf)~@51`5+U9HpBtZvA9(=7J_u`@k9xM20J6(Pr^-g$8;5m-%OA<|qx z?+l!keH-Sv&ELhAFa%aR;IQYU9#2G$aZko;U0V%Y3SInY z$i|MqMe8SN9(|`AD}6uI2)IUZsia8{Sw}1UH*U_3c(*suymxP2=U$Fq*_NZ S5pI?R8;G)>z+`@1KWXZjN*GF4=`IDe3kAWr@1A9u3f9dXPHZ>XV^7_~k@ zliVCdTKjMR5wQn}#`5k7tx@cxukfNN%!z zUa0JKUX*LemV5Ssu?9F08`tWI6(6zwBjT9kiA^3&e~hS~Is;YMj9V5JGn%0kl<5!B zRG68_yjo&3#2mh{QpE~0@=#uut#0maBV|DOHn$N+Q`eD>FR}!t@4>bwh@g3~hgs~i zgjJUbv9w{28pUF$Ftx;qgv{sy3EN+*dqqAR!17jS5@s|_6$p1<=k$iTpym2~w_Mf( zwkp?Eu_kb9E5Y?|GwuWP_uz1pH`nWUI6cPpOU~u|2!ujv^#blgYrDbBJxs3nNR>$_ z;9{+0U!F0{JY%RC*r;BJn77Z~v8p5y8HEcbKIk@Uzr$(+tKiQ0@vw6<9F|f~vE#dz zzEsSW98_a O3 z&TUG&1(MUYq_vdznf#9ZZl~EjnjT3%G-939?VO-(ZzlY`hwW*J(J&Bm9{(f$dG!Lr z*;C@fPy%$e5`vm}RPCGOP UJ`>2|m; zyHZ|(of4DbU>jw=g_4IufI{WdG| zjzMjg=Y<>>FDe-Q-dCuYYRkP_qpqrO81 D|w~^Ztgg%`S z2>+80Zw*G+0(!xy&S+}PRQVs`wyzt764-lP(0pAT(_I5IXEz18o(P$Kf09J3=Ios` zD(swCtbwUvyEn8Tt0pG@10|N>YUvIBBf-D<#3u%HTC$hUIX-txT9dAlq|rwqRSU{J z%kLJK3nhCp9iO7Idjw*WwnTyCcelI43P;RxQ9HC+7>h~B{$nh;@$fe7-d_bx*`~nFSUl|Gd#J1v6Os%m+*jr97`fi3&^(T|@e0PO+MO zHIDNwgn=!zn||;^_+_UbTXbPnvu7}apf0DtCXm$&kxs&tRy!UxKDiQA|1+uw=s}Z- zX@?){oJw2?U9Ym}!^FNM&uVkj8w3m-Ns@8L$ 9|n>_j+iT(OyG?)SW@OP*+$BD^QBuxLA^H<7ZgiFBz(Pe@UP%K)D zAdmV`7v+GPgRfr^bd%{F)OK_3Li#415-a!ER$M ?UDceiQ^+oL=UsT }zUV30Y{E_WOtzcM%285+BQ>SoL2yw?IlKqeNcGqmp)bd!~;&++iw- z<@X&8T0Ku56V2W^YGLg{G5ln@-ssoQ(~W+Bk=@vUeKWJzv`ss-$V~)6WM*E))@}Bv z&gK~OCDys0b|2Ap`JgTa^y=|JTQ}h_Rzxma;~gV{N|}rKtFZ0nH7wn_G0yuohhjPU zs-vBWw8o2INqgcX!4u)HCGqSVJ}HQYK0;*779(;OXo}yF=OM$xR(wAK7tJ2w=4GfB z6}@xu1=N;^d0Bdw;+(h?Oo_8k@BN0GjA7q9sS3SvM^d6-M#@_|JyFLFw;?E^Q46X) zzBRbZ7+6A6FYmgM`^tto>Op)lu-{%0{n4MxE9$y)_aW2e-dXS&Luw}_wyRx=ywc$? z)loEF+Cj~`;_LViZHPTjS!MF1k!lGK+6G=eTUsKB)K5_>R%cDhk5|=m4y`Qwp>5>A z!CkTdd1aVYGPY$S!s_i-2{mhyZY@+YFv^{U 71&)zBAaHF@Xtoz7=w%(V5F+B@o zGl$~FFBXAHdCCq&6n;IyZD4UAdALIM@Tbr>{P*vW5C* ze34aAJZEBE4HTT{tdd7FbXSI9#T}^XhON+8SUMnYd`e-ie^HsN#8WHK3LtRSa$?nY zZB_{}>hjBFgH29RWKxtloeF-OQmanMAQ^w2vXKkvi#9L%#6lBc{`seemH^W=atmY} zGIViENRJ+BvXUuHYam!Mo!eMG3+&LP>*J%WzF-0#1K}f4^pZBQvChV$wr|%Zl#;%^ zuB(Qas8LzQVxDM~E`eVJLU~)XJaQ-WVs6~?)wMddQO4!Gob<*5^LE{Z@n6e6){b}Y zU4KG==wd>AZC!gh7pF?|^>)4IRw=`$T#vfM8T@vAKTD%;3nl6ezvgHBF7~Ev-@smU zl-f^eaIp;qu-*tl2Db#YG2@?bhC<;mWOO}w2t*GD`8i%qY hMP|wpC<|E#L$;P`g|o%Jmhf! z?YC
p?9lu7 z-}k;-i&YNwWSYV5O7)HG_A!4ixHiqN9g!{xn3Cc{Zb$nC)Z{ARWZ(@UBIpexcLu02 zzSqv-_Ac*tXYswRcYTZzh#K e`)qTvKpe8Co0Alvds@_ykHFR#pwR$s3z(eAKw zY5W)va=pDU{4GfCr BOp_&Ebie`M# 8o8X-9$v zUW?5t<0#!NcBA13X6g!=Hf7fBfz7QQ*Wwv8M!qUiSsKs<&19x>E3&No6q@L|5cg^$ zCOu|_eD1}TkWnba@X wx>o)v5`ozmrp;XaMObB zrZla4zVP*)_Wx4330~REl@()<8u7hao$1bZmHjp9f Lq+KmYn|E+I^YF(nAU#sgr5DH_4v znZqn4EnF<|1|Y~U$j>9d&m$ eu$
|L=!XmZT(o5lSITCBoM_A;}im#!l8Ok$oQuDUwR|7%IjtWM76vStrKW z8Dt&H*v2x9xySc+pZnbV{O`Tbeg60N=XgGtbKakG-sio(-tSks57d|$IT;}cVphL@ zR}X?{!LPIs{m~ 6$z=p2=_l_01zj_Kghaq#yg+xvRj5ELi?L17UPL ntl*yjKI^f-jv zYc?I+t0$k^#j6XX*oiY-7WnZO?Pa>MXLl~$zeGF5))QfYsWfm=;LRu9&E`9wXs>iv z_e-X6tG ;%fEkgVBDv8WxB>!Ma^Y2lF4G6r(}?YdJSXM;4Cxf zv07h>Y~PESAGuLEzTgzpC$eVqIACb=V4MrvRia)pKRh&9Ui!?@HoWciylptk2`lr) zpe1MgO2MEz$+9kBb|khFz8@G^;%8N}jh%I|P=Md`+41!~8kU5b5ud$zWU=|uYQqF} z)NgN|3tl|F+<^FpKuDE4#Sz9{MJuvC&@R1DnGZ>avrRJ-l&X`HUAw^>S)w zV|`ZjrU}x?VW8>9{pA|rf^sbn!@s1*5;S~Xv87luSD3UMihmJH`!-D+Owcxc6n{v@ zo8M5gKVOuVnkoP#M%Y$iOgWS~HF{nye@7FJ)yJwwpAY7WUF)j?DC(dRBm*D>LJa-mxr^?snbi z?g<_a5*{+K*;+xD>sgkYVpc-$KmJ%RzP?_9Nt_d}_C99avDCgKZ|#%FXm&i6yJIk* z4Mu0&;@a82AR^rgTjR;kW2QgrvCo^5n<0AsFDSaeMs<^X;q$Sa6zxGv7`>AyoVk(W z?t86nBU?A!D!Q1wdUxf$#fhXXB2 %$2`=AdhHv*cDK~kX<5}NV z)G~HocO@lpcIx-I^QLErbzgN3=;N|mOM-d1_g2m<)CVwv#g!keI+!N)Si&5M6A?9o zLdA^l5`KU8{)47x9I$CQH&}o1BHKo(RilS(3Twmd0%YQg>7IFMEs5|K0&0IoD>=qd zPv!bk#f4 uA*rLW$qb`SmaqM;Ik(6#Oty-a-B?G`SMv7^pogdkcrz zGMK_)ri)t~@)3y8o%*mv?2NAPR>Hz}*Um4wo$!*I>$o^5nLFd6=IulFx$vlAl8N%f ziIXK?#{+hMPqK`SdptBIZR);j8V$u63e^a&o;q|+t=XIzUlQ91{LGsPB EmRt^e}?sXNw+n>|W ~T^5^$f%UJih zBqXYMCtA!iJhP?3$0i?nmVvPIyZ|}X&1L!ebgIL^7PI_&^Yd+R7>*JcbdKio*^`ZO z?X_yq0h-I5C-Qb8U{ww(H7GpOYTxSDyLLc `ZA7waL;DZ$()6 $lMz5k}H@hn7L9cZ#GC@_D_-(T#N Nv;45s-?{yVNhKy@^kF(>JAvVoRn7SGno~ByS^EVpbL(8;`IM+c z4(dv1u67x}3#wDq2$pW|v?3=cAD@%LHjlJqkveRz9?lAmM{RQThP{26Dtn=mlV&Xs zh+~Ab`xz4kAGr@3k})CSnFUquC!KEriNn7vLHH`5?Nd2!$x9~oHL8dQVnd^RYt5r| z223cgbwq;Y#5>CFLBTKd{p9Fibp0RHAJPhEb!O*&@3vaRUwYi}r@hjhO`oE5&Wa*R zUCecClaGua*}o9}kq^joISCHKSS>p!U4axa3tM+J_NDnmvbs;t##{ta^5yF;B((8q zmHBxOwV(SELq39s&75LjzI{>!qb+eEBldKmY@LZy;hDAa ZCjCQ=X6UaUz#X-I! ^!{X*(Lw8Yl1VF zFO$5O5mi*0sQ%7S?sQMr*Y{v0F1^|6_;SF0^XmMtQyW}4bo5d#743RvYZ<30DWIxF z@=6ElN1;5xnp5=^-BovP0Rt!*Sb*%vpAp1Zetmfss$H&IWjm1CHGajG@%5z?J$df; zSum;k>WX(w6ZH0@JqLH)L=Z~LYu!(t2())BrDU^N`qI_uyV?q!7ico!)S*d@Khm(h zOs0n^HO5l(wTPXh*-!b%(N;JtH1JUdVID+y{cqA=z+o$<7Lgxw3& WU%wg);*^D*jH!2L2EtX4TR7mI*9&pnG17*r$%%& z^YcRreZy3*UuEH^OP6t&=UcGa@J|yIo@EJ~!?C*kkN5D0(!&)3b$U5f J$wFzwTihXS zJ}vEORLNwkDRr*G%-gmD)(kgfInpxr@*dn4xH-NX1-ay2_m5oJrjA`&*jpNOc6EL! z@QGYw6imYIWp--q$iC?mq%(kVt#}%x_GnYH*CI~FWqdV03o%XKvHA?uSWx3j0>g7D z`g}4k7u||tpmNhq^jto&0(c7-Sznz%l(yG9zsBnGeZ~$4In<6-S_%%+^3%m6hdwNF z!_)P#VW&WI!tV-`X>iROy>YW`4MB;&jlsQ?M8aX3wN_(N-RBj>72ZvhYJ&5qHPmI$ zxs;w=H*r4^WejK>_nt$bhN7UNO7mz<)(WNHzwuJ^soQ}Y(uf-KH>|o8^XrY|n&SBg zzczXN--EDaR^To8)Iv$+%^`1&M?=QO=Q7&2wk?2xx0-*I7lCjM&+M5fpwauXj@Q^z zA?dq#%1b>YZQ_1B)pAL2T{~Uvh0_Uvd6i!4b*ef4+4h{ME?v{}C4|T5wCGu2g^W6! z@(#Z${r 6Y=Y+>s6C7VP`Jp{+RcD5;mk7Mj_A &+hhT;71&AG(dki0kD>F&_a67X#-JPaumYPX$%vmF#ma+nR zQZ{ s#6RsBg`n+fsMsbo4dZZ}u(*X{*V zw QCCbe?3o}-^icz zZGXj!SY8f&ES8s7pK5#Huz_rwLH?ZC--$m*#Or8jz1Gos9jEg;R_FDb*tj=u&|KVH z0n)PK;$+{M@wHJum6j_iE$%0yCQdWQj)juC1}Y7Km>Sfu6)eq*DmiQQrM|Bs-ZObg z4|!N+Y~vYNEg7_}8m@}psb~)X{LCNau{1O=FiL v (<$8X~fnMTC!rggC;j@YUDu*w=<090fMw-+j*uX(!OSQ3nYMf3E39 z6RP`LSnonFXVTY;mSiqhv*z#bE~|PFZx(6j>bxvOIJ-sp)*DzR{B>2$?88E4O;+0i zN3*l*S5B_N>%U*_KZ$6IJP5f~dO5FMBc!JHnXF&OqHqHaW21)q_Vb7^{r18Wv_tSS za!FloCqD;>qq$5e-t pMvzs#%6}&wcuU)1b^0XxN{U^zPoxe=xr~F?2$Oj+32fZG0ABr}0DF=-M?ax)9 z-6WwB!KLp!1w$GO#lhzWo_(KAphPOWQ@Kal#bt!sui~i@BVUHDl0Hn~QQbcu%r!e} znL9WCUZZC^O*83NyhY`!Wpz%H=r&})-G#&ECn)SCw=gSc2mO4{*0IA9?0yT$e&AR6 zyqt+MJrp{VPI^*pe!Yy9;G26CjydE-ylB-FQH8_OxCzaCm$^!A{9ZwW038Qs%td5e zd&lQZViVQye$d{w6CW=sNf(9;+}O_krLiy;VialO1~*KzxnMzY{k`AUM?`2eSm~0= z@3@n&pW4iq>bm*B`6^nfQh{x9>G-nHYQ?}@0sJ!|PrS5>+5xYbGoeVPeT>hM1bGWj z|Gru49U;%n$`D1~SsmIYbVG_i*El(QQe)vl47%*o@Q0EgMlfyyi@m4T`+$6;$hrQ{ zASz=H^b=uVh>eE}C Biy$>EOy3(T%>q+)x9Uh=jHwg>56mv|MF412tcd zuOZC);ZP>V^kJ=!Kng8|2q&>Pj8D*}mp^z6{Set_q{AQb-bnm@u1lZtT3s*n8i-iF zEs_H?zOr*AByT!AeHjT}b34##g4s9GnO2(K`CI3(Q_RM`OSiy$4nr|QR%BMPpc^Fa z8}@IK3G**pfd_1x+Y}X|YqFV6OCJu-zW0=WYlyEtDt$knTn!R}yay)q747XpBXQ?b z&3@!%zXRdbV!(FkIzu8Gt@XPA@eN^s!JIW?u<*v)FqI%`S4^MOu%%tilM?D@Q;C6Z zv%Sniu-h*bB5uGx)diK5C!c|0`g+Z-122c__@dfxdzNHKI+?fUlkxE_A1c}AYR<20 zmmdZ&G|r3yz?LG44Qg=7mj5!up8f3AyP*N$&zRBu$ OG$z%nOgE zCY78tzC$0TN+c8nHTUSfbG%1TjKF-WV-q{raQy_i+)Xc!%npadj^UTJ42djCHX>O+ zNjxnLlQ@j6asl#nfPDIG4LC{Seyn 0PY9U~`L%Uat_MNH-of5^W$K}nt3#ycfRV7-CUQ+Xmy9J8&t1Zm}x+6|i%bWuod z_h}eTr%nE%x SU?<> i-_Mzk%&DeO zi;YcFGQF_W`m*kGL_re{`Y`@S3zWyfqedX$bN^wetjew1x`qy)FMK2w!x^+P$DMeb z)|$a7G*CO3|F*@CyeOcq aTTtZnv%FC2Z-4(CVA$94Q^({Cc;h^I>Ez{DWsxjx- sa}lYt+xV i5;KnzC+!LT>KIdgI?&SVa>cZW8q(BV? zmcQfA5W|}Oj`$ZB()#$(#HseuAC*UQ>$Wl`$?8>9E8U};lK@DDR}Cw6JScrp2eRJ& zj$L9$4Qb?B^qBwBc$};KK%=+E0L)Y(>El9vY +@eU1Bh46 zXL ^8AS=z$iq0TvESQrv>Hp!ALiUb9 zul04`gzKBQC7L-oFw_5*?3oEspa}eq8N9RxX?mqEaQLfL)TJ_SOCFkmm$Hsb@##>L z+Q<4JKygd0VP5tj<@U-7b)8j6`F~bYEkS7Qth?aPc#L}z04sLby3F`L5KvANl-gxa zL~XG<^$5Q8RvWa>k)a6-?cZB|F{zQe%8a1uQ4Zb_P(u00+PL?YH`Ee}M`aaO9=$mS z?W$oF-5(B4oheQDeWg{;|M^5!vjI%oYag#Ggvury%)*~O9_yCdNuH#G4qLmQsTq|f z=vJxZ^;cn;fb2XWqp$1ukt8;j6rvo5HUZC3LjYR?rWjW~Xlq>0##4e2tR)Zs+E8GD zKQ}7a+4}wVclFnWZzznFcnJd({QiP%I6%>W%_%rsaw8)2DBfkyF+c6UUN!?cNls7e z7XfIE15rJCdAI8qxr6FC5sx&0Es2;k&QB?QH6?nS1wm!7Y47jRvktdu!Z2duk{Kh7 zDj?CfnsS6I8>W@1J|>kf?gUZUqXrHbS}2Pxhe^G5zs{IZM7w_Pt%L%bHqzVb4c;+lyC)bt`9u@iRhl8y~p$I(mWubYCW7HEfZ&ETp^5b}fhr z7ZOQ$rcAo?E->@Hg7Fs~VLg`fc~LPqVl?gwKcSbEWc(_y{;tBqe50g%d{Vw(CqPqI zqQpUdR&X6)l@+y~D_W68)ZT}AIJh%&D0ffX>AJaZF0tsi&|MMWws`u3?7peKxsiL| z>FF6=qXkWtYwy?de+LE~WSU5GhVzybZ@F)_{2Lv2)hpCTc&}J8Qn2*<*xgO)?wY@l zyb`0%TcbloBZ?v)g7+PRp4}(5lxwQ|8V_ITd4FO{zt(zH S3VY(QNs(}hbOBw+Psw{V_q&H>t~A5#Pzv)hNAJRhWf zOuI3k-FbY`^U(|Q50@`E{!--t%=&Db* c(65|Qp?|3HZQJT9`$&~i^(h9zI_qb&o{R4_{LJEk zl7A+fNyVScxK%+KNa6IBBrtgy!bvvNB34dNhd2YmE#KVD>bOYQDO`?gmlXMm&u9g9 zR =~|Yw&}QcL#BpG-UuXo7VD2X-S#Ua4D#IVjFP$8rXA1N8 zanI^KT0*kRW6M5*VcLG=%(0wqu%Bavl1~zI1dXbQA3oYoR~_5L5KyC8h!VfyjgqY4 znUCI|clwf-LJ}4f{&GuU8y@q0=cEY%u%w}yzmYW+dH62-(P|pwGaN>sZmvuul4Guh z!V;5Y#Gn83ROrr ZcBZBGP5X~F`wJAdmB8wypklAE)_Qnh=`uUC^ztb|ZG zJuNgR4mVe&6; &T&B1(bztz8@P1M7CmO??@Ah%k+|IFY zo)l0v#!KEO+?c$095DCeX9=}qg=c@d5K_L-LF~E!rvlLe08$%G^`1-@Ahl0t^I^4! zh}nc!BfWYwL<9(@ABW&{u1m?v_*p+r<^ZpwiPc8yxZwG#Sp&b`*L%`2=h_T#mp~Db z!|heLnaC&YQ9F2t4;)tXt~k**=jcF#l djC?D7|>jeAuX!3bNd8qRXXNMP%%WNs^Z*G-}K z{}FK+5pBmKhvr2hUl$Odfx^eQ0&`v#MKFf!6o5*YN4rDdPJw+f!xQhnD0xzHAI6W9 z3y@s-zCj_14*WFGpNsXEzp)B$XO2|N1@3TVR8QZp3A2EO7QT%K!A5q%s~uj&M~bYF zSbyhw*2~0h4ck^dGfGhu6YYmwfCNA;c43lyO`K=XZ0wW@U$Qg2v!?d5gUYKE$~%RQ zLm%S9sfveNm{WTTyOhw^k~YII7R~$pjB1v->qNvjz;Xj}5eRrlYWscYPM8GCjq4Rr zP(gWNHNwhqFrf$3b(d>BOP4lUi#speuxNamhx+X0=8cKnj`8|~!mADLF J~EtM2{U0mAh}v z-#_%o>DuA8Lww3%a2&qDw70Bz0qI-EO?Wqr`J1rEn~&t!djoQoxl1(ABY6o$HO%^3 z{ !vO9iDbQao%zCM zu*FS+GF6NYc )g1%*( z)1h6wrOv~_M+MF3Ij_+QGUHJYRA==+l9etwS_m kjK?g54r*s@b=;?hEUF$a*0G?>|_bKf+0vS|OH&JQwI5E#t z$Oxcme2Sa6G$n_NG!RUDD%})Y`ZG8|_lT)QAvVPX$L{gdG)^nN*Idd$P5`vr(Y#1Y z8f*iFqQ2P^&I0ww7U^*ZvV;N`x3SYfo}yb+VBuZUBh&h&t*|H0Us|@u{0cPbS1-}% zqkwA`=zwZUFck(#H`iKQD#5Q`11P9XP3_Ld1!VUW=qqhfimrHT}4W zZ5Qp+SOewj%&n_xN!?o~Yj3UHXVs&~>t2gol$Cd^xoBA9R5!R}p9rQ~MY-2@uS*RP zL_2G%2eoiInAcT>`?
5NuG<_ z@O75Y4ng%w7U550dO sMvU z4(IO&Y^