From 05a7cdb6a4bbfe35cc090b8add71fbb29337ff26 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Wed, 24 Nov 2021 10:36:06 -0800 Subject: [PATCH] Updating dev docs --- dev-docs/README.md | 2 +- dev-docs/diagrams/software-interaction.dia | Bin 1185 -> 1226 bytes dev-docs/diagrams/software-interaction.png | Bin 10246 -> 10326 bytes dev-docs/specification.md | 14 ++++++++++++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/dev-docs/README.md b/dev-docs/README.md index a078f90..81eca1d 100644 --- a/dev-docs/README.md +++ b/dev-docs/README.md @@ -18,7 +18,7 @@ The arrows in the image represent the information flow between the three pieces - The _Client_ displays information about orders. It _reads_ this information from ipfs-swap-service. - The _Client_ is also a wallet. It can generate the needed transactions to _write_ information to the P2WDB. -- `ipfs-swap-service` imports data from the global P2WDB database into its local database, using a [webhook](https://en.wikipedia.org/wiki/Webhook). +- `ipfs-swap-service` imports data from the global P2WDB database into its local database, using a [webhook](https://en.wikipedia.org/wiki/Webhook) (dashed line). It can also custody funds by creating an _Offer_ and submitting the data to the P2WDB to generate an _Order_ (solid line). This architecture keeps the global database highly censorship resistant, while allowing local installations to maintain tight control over the user experience. The goal is to have many redundant copies of `ipfs-swap-service` on the network, and to empower individual traders to run their own, private copy. diff --git a/dev-docs/diagrams/software-interaction.dia b/dev-docs/diagrams/software-interaction.dia index 66cefb4709ec48fb8e361be138b7715491a91ae2..44765c5d92447cdedd8c1bb6730585149411db4e 100644 GIT binary patch literal 1226 zcmV;*1U35~iwFP!000021MON(ui`co-SaD=yvA*;@)u@Y+TB#k)5;=(p z?if3A3_Ldd?R7rhSLts|unX^DzyU z>X*MhO&s;(YV^U!@V$Hm9PSkP1dZZPOLZ$m_0;kew zs;)+gQUvg!fN@*a3Wea<-3z2pxI;_Th2FP-vpx0I)GD*{7-3vFK(bVyHrb_4GoWb+ z=?r=Z1LSf9zqNzw@>(pqfrp4!fp;N`urv{;ux8SN6WXs~+vjD$e^DeYF) znBz5dw$+i?K^|aQ_a#S&q{Crombr*88#tD!8*}q@T&{QL-q#(uuRDHUcQ{&yj0+C2 zsJnC-BM8#etKfUo-B08}BA3{?ut0b84Hkl3=>G z)kTPcJ@!#_VKJ9&T9CGx+4R!5SM6>b8Xrd?fv58!RE=7&AQf2VFc=}fr%cn9Dk%&n zf=w!UVn9#K{Tq1$=l?A`z9pg_ym*XK8ICMPCn1w`jrwu<)}@#>RjSm)t6XG=XFYw+ z>r*AmHd#-UtpBjk1Z6mf*H4A@o=#l0jz1B0^tO--WuiQ@7d0=)WjT)hrTV*GCPH=e zB$_M+YGh6ZF&!#<3}#hw)(5H$+jXnZJdTqF1f}qnwy?&)l=q*3t?Aa-(B-|GLqyPS z?J-X4g>o+eCHRTR)r0yjaQY3{TZDtHXa~2uVaF6%H|&lsGvgXBA@u!nxmW4Eu63MO zfnI8ZQqAZUo3@ciHa#V~${q=an`japWs-~#KVT1y-Vr7XStX{mE0y4@lQ~szl-xX9h{?^wHlCIUs>OSWIHq_n@}knijMM3@5&3)@)|Z z4a>gGXF1z65fp&2Oa*g&F}uxExkx&*XV>+-RO;qR76}2}q2~ESbiZq;AI}M0lkT(? zLDO6ny2}K(RVIKvHU^Xlkm^J%6GkEv&cG_sJ)Vb3{P-&I3&E1?4<#5_2@Ei{G-GZ$ z4<)#p5*W8Cfiduo!6H^jK`kgp$6@0@Q3mB*XPl@fH3#5QMjW#n2(J@&+_o6 zOte1azEp?Ln4$)GFmK){fMMkU=-R?G#d+da!#q&IgWW4WA$!4HOcDqdCJTh+1sTIiz#= o5262`)au1^x2u(YaW$3G&&fYRR-@8iMpmPL0aF?OAWtm-0Nq(uTmS$7 literal 1185 zcmV;S1YY|eiwFP!000021MOK`ui7{ee&<(2IWJuaLhO(L-9n|at7;!A?MmBfACZ%o z;H|ME+rZ(azkQv{DdYx+Kv=0F5A8QL?cl9)3rZqM;TV zn)9Av90P<%p=2x{MM??cZxl8dTH~4Nqu^U4_=bgMCY8$toN{4o5uKS&%ltBjInc0x zbOJp_5%vW}-e4Gjv*m!6>r9i&0~6P=;n;aym&?`p_f<#lt4`ck9g&Ne3ndUy zRh2&H6eE^tRbqqN>yZJX+Qm+p1=^!8iBkN`{FjKzw-}HO|A@Ftqc;*HJRQ6Ri3XH# zufIvq>6YwBs8)-YjSaLC5KT#dmiwDA5vd#{41h%9QFqw|q*iIy0JVX@jP&EB?J z?yJHtl|?Bh^pZ@|N~AqcL9Wyyk$5Qwa;KA|#9~VV+hvPM($|j zjG^mYr?Z%C>H-vizD@;Wdpf#KQ?W)m(X!k2p;Bt6O4kSxTjTou#B8&!DIZS}T^;W< z)j-1oE3~Hxa4k&$uMaz<36SwbLK85hiAl#S(cYd1OZ@yS@f#&N*dI*LF%v-0cP%(} zCJ!dK8xz25nE-a&F~Fmi!MRV%03SWWgAJP5;4k>k@6Ww=5#|1)QMe;LIFCl*#`N&F zPP8Esp=O8Agy9-`aIS6?K)3V&Y-{Sk{wTTIAU#y_CR%0k)lO}4IJdwoteh;KF|D?# zXqnEmX9RIsb=_-;i}-_u3nT>Jm4OeA2;r5`3yN8Eiu_t<_=Acw^!jEEhf`!(VUE{- zjFpa%JjE)W9vh?}%U^k|gH>QW|clsK6-YdLkp7;I(6%9XmgDC(2^CC(D diff --git a/dev-docs/diagrams/software-interaction.png b/dev-docs/diagrams/software-interaction.png index c3b74c96f09e7bd8059041d47304f1f65ac1b152..dfb7b3a69c15b46b4568a1c66dc213c01432328e 100644 GIT binary patch delta 6265 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