From 60d87ac88f54dd9f222c03c91a462dcd66a932d9 Mon Sep 17 00:00:00 2001 From: kazute <48340051+kazute@users.noreply.github.com> Date: Mon, 29 Mar 2021 18:51:27 +0100 Subject: [PATCH 01/10] Update 01_introduction.asciidoc (#654) Changed full stop to semicolon after two-fold, before giving the reason. --- 01_introduction.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01_introduction.asciidoc b/01_introduction.asciidoc index 4cebb52..9e7b299 100644 --- a/01_introduction.asciidoc +++ b/01_introduction.asciidoc @@ -80,7 +80,7 @@ Cryptographic systems like Bitcoin and the Lightning Network are systems that al The big distinction between a cryptographic system like this and a traditional financial system is that in traditional finance you have a _trusted third party_, for example a bank, to ensure that outcomes are fair. A significant problem with such systems is that they give too much power to the third party, and they are also vulnerable to a _single point of failure_. If the trusted third party itself violates trust or attempts to cheat, the basis of trust breaks. -As you study cryptographic systems, you will notice a certain pattern: instead of relying on a trusted third party, these systems attempt to prevent unfair outcomes by using a system of incentives and disincentives. In cryptographic systems you place trust in the _protocol_, which is effectively a system with a set of rules that, if properly designed, will correctly apply the desired incentives and disincentives. The advantage of this approach is two-fold. Not only do you avoid trusting a third party, you also reduce the need to enforce fair outcomes. So long as the participants follow the agreed protocol and stay within the system, the incentive mechanism in that protocol achieves fair outcomes without enforcement. +As you study cryptographic systems, you will notice a certain pattern: instead of relying on a trusted third party, these systems attempt to prevent unfair outcomes by using a system of incentives and disincentives. In cryptographic systems you place trust in the _protocol_, which is effectively a system with a set of rules that, if properly designed, will correctly apply the desired incentives and disincentives. The advantage of this approach is two-fold: Not only do you avoid trusting a third party, you also reduce the need to enforce fair outcomes. So long as the participants follow the agreed protocol and stay within the system, the incentive mechanism in that protocol achieves fair outcomes without enforcement. The use of incentives and disincentives to achieve fair outcomes is one aspect of a branch of mathematics called _game theory_, which studies "models of strategic interaction among rational decision makers" footnote:[Wikipedia "Game Theory": https://en.wikipedia.org/wiki/Game_theory]. Cryptographic systems that control financial interactions between participants, such as Bitcoin and the Lightning Network, rely heavily on game theory to prevent participants from cheating and allow participants who don't trust each other to achieve fair outcomes. From 29708730b5fdb63cf2abea0b7cfff0b83c1a5a12 Mon Sep 17 00:00:00 2001 From: Franky <74006097+FrankyFFV@users.noreply.github.com> Date: Mon, 29 Mar 2021 19:52:09 +0200 Subject: [PATCH 02/10] Update 03_how_ln_works.asciidoc (#657) Typo. --- 03_how_ln_works.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/03_how_ln_works.asciidoc b/03_how_ln_works.asciidoc index 4af3ea9..dad57a8 100644 --- a/03_how_ln_works.asciidoc +++ b/03_how_ln_works.asciidoc @@ -19,7 +19,7 @@ If you need a refresher on the fundamentals of Bitcoin, you can find a summary r * Transaction inputs and outputs * Transaction chaining * Bitcoin script -* Multsignature addresses and scripts +* Multisignature addresses and scripts * Timelocks * Complex scripts From d0617df5679184e606301d6f0193d886a7a9dac2 Mon Sep 17 00:00:00 2001 From: GiovanniZotta Date: Mon, 29 Mar 2021 19:52:46 +0200 Subject: [PATCH 03/10] Typo correction (#658) --- 01_introduction.asciidoc | 2 +- preface.asciidoc | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/01_introduction.asciidoc b/01_introduction.asciidoc index 9e7b299..b66377c 100644 --- a/01_introduction.asciidoc +++ b/01_introduction.asciidoc @@ -51,7 +51,7 @@ Now that you're familiar with these basic terms, let's move to a concept you are You will often hear people calling Bitcoin and the Lightning Network "trustless". At first glance this is confusing. After all, isn't trust a good thing? Banks even use it in their names! Isn't a "trustless" system, a system devoid of trust, a bad thing? -The use of the the word "trustless" is intended to convey the ability to operate without _needing_ trust in the other participants in the system. In a decentralized system like Bitcoin, you can always choose to transact with someone you trust. However, the system ensures you can't be cheated even if you can't trust the other party in a transaction. Trust is a nice-to-have instead of a must-have property of the system. +The use of the word "trustless" is intended to convey the ability to operate without _needing_ trust in the other participants in the system. In a decentralized system like Bitcoin, you can always choose to transact with someone you trust. However, the system ensures you can't be cheated even if you can't trust the other party in a transaction. Trust is a nice-to-have instead of a must-have property of the system. Contrast that to traditional systems like banking where you _must_ place your trust in a third party, since it controls your money. If the bank violates your trust, you may be able to find some recourse from a regulator or court, but at an enormous cost of time, money, and effort. diff --git a/preface.asciidoc b/preface.asciidoc index 8505e55..4beaac0 100644 --- a/preface.asciidoc +++ b/preface.asciidoc @@ -184,6 +184,7 @@ Following is an alphabetically sorted list of all the GitHub contributors, inclu * Eduardo Lima III (@elima-iii) * Emilio Norrmann (@enorrmann) * Francisco Calderón (@grunch) +* Giovanni Zotta (@GiovanniZotta) * Gustavo Silva (@GustavoRSSilva) * Haoyu Lin (@HAOYUatHZ) * Hatim Boufnichel (@boufni95) From 1de53b46f59e74a4a77e1869a362ec445c3ffe98 Mon Sep 17 00:00:00 2001 From: Matt Misbach Date: Mon, 29 Mar 2021 11:54:10 -0600 Subject: [PATCH 04/10] Fixes for issues #655, #572, #624 (#659) * Fixing a small typo * Fixed broken link to diagram. Fixed text references to incorrect node names in the diagram. * Fix for issue #572 * Fix for issue #624 --- contrib/history.asciidoc | 2 +- images/dina-routing-diagram.png | Bin 0 -> 24429 bytes images/gloria-routing-diagram.PNG | Bin 20019 -> 0 bytes routing.asciidoc | 12 ++++++------ 4 files changed, 7 insertions(+), 7 deletions(-) create mode 100644 images/dina-routing-diagram.png delete mode 100644 images/gloria-routing-diagram.PNG diff --git a/contrib/history.asciidoc b/contrib/history.asciidoc index 6ce507c..192db97 100644 --- a/contrib/history.asciidoc +++ b/contrib/history.asciidoc @@ -27,7 +27,7 @@ Using this new feature of the `nSequence` number, the RSMC was able to enforce a If a participant of the channel is able to present evidence to the blockchain of an intent to claim a revoked state, then the honest party s rewarded with all the funds of the cheating party. -This enforcement of prior revoked states (only the latest channel state is valid) created a very strong economic incentive via the penalty mechanism: if a party attempts to renegade a signed contract, they lose all their funds! +This enforcement of prior revoked states (only the latest channel state is valid) created a very strong economic incentive via the penalty mechanism: if a party attempts to renege a signed contract, they lose all their funds! This "challenge period" enforced by the `nSequence` was one of the novel contributions of the RSMC to the payment channel design space: the blockchain was used as a court wherein disputes could be handled objectively. diff --git a/images/dina-routing-diagram.png b/images/dina-routing-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..adbc62d80a8d85a07a50961c4a4c36b9b110c414 GIT binary patch literal 24429 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 JiFDB_`0tySu%G|{ literal 0 HcmV?d00001 diff --git a/images/gloria-routing-diagram.PNG b/images/gloria-routing-diagram.PNG deleted file mode 100644 index f614bf26d970ebbf1fa4b75c61b557cbf25fbda2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20019 zcmeIa2{hF2+dux6ib^Dj?5#w$6dGeoQFhtN9!ZjsWiYnUMnfLv^?(4p<>%Okn^}60+ zhWc6u_w((CAn4%rYgcYS&~6S0+I5I^FL-C}kX8Zs!{m8G>oSzzAwU8D>~>PuQ-`3! z=mVR#_kjQRJ-l|y6N1?5;2)+Yx2!u5q}P1?in@uf%`7pzRKOG`{cwBF_Fl%G#$%Ji zWlL|$^7ntQk9b`wYkr;J^x5q$yhxJQ+#&C{TEw_(?&F9;M&(4!e8{z3p5obo2 zAjrXS@bgCZS4&|7(q>D!*SE?B$``r#bT{h~73&~kMo|FKnDQ=9I)ms>x+XpEFHz;b zfLrdU2qkRHZ<`|)ekeK5yRZ;el{W}0KFHT*sGmQ4+xt~55*e$%`MZrgk7jrVeUg_f zn+;oDo+BM`VdgyuuZ^aS*E$w6=0Is9S-e!i{`j<9M_bFhxHkLXF%uet-X4r}Wc*T{ z*Ted+Mn+P@ThNWodxLL_f;G0gLk!yPxG-sp(o0qjbf&j_Wg!%lR9S7NZwp~3;+Dtu zaJ=t)>urr7|7GgjOYA&?W#U!YxuyOP;!vlg;>y>sqSadKhMxYVaDE}Z?RB@(izv4* zBT=?I#!OE`!IlYrDO>37Pv5-Nm$@WOdLiULoo+w<>*sQPc%;**`fJa8@9wJkct{9> zWR^$09}}vvmSg6JgaS67fNwpwJBi9v+#>yWZ#(aom#|;v%VQP@Vk^elu3n?(V*1j# zXOhJ;*rL;2lCC8yI;+$B|JG|b5?l*!Upuje0^V;`4^tQA!Z$bs#535FNtKI(%eZ9M zdzJB%tJOxjdw9>mb9vg)?xTWZ{FX4!oH28g%wWSmDOE{QaqljsL~ZySHHP-?%;Vj8 zEP29f=yh9n-pO@BXktnAPhU54DeQ-YT{65oazzSTZ>Z4+R7ro^46m8VIxheA-zufl zFPZN@6#VGKj!Xd?)Pt0_!UcNsTXS3Xty70Zpb$-82&$>606UO>q*jp=ymJM9M{T3! zFBZZvo`SQCi#EGiYf^TU^fAaCEOhJvvvePll9lc;)pls)QIoA$2J{UH??7gkmBv}; z?ME67cql>gziPR`?|kYxwcbYujGv73XgM8!#F!~79A4CSeQfNh0-oPw8+t~HFiR6f z?qiKbo|7H+`)hu4!HemzIy)Hu>fEirC)yMHrpDuywv3{X)Ml^E#imS&{4c4w9iEtD zbpk@;8+YvOQ`ZmF{5}jW>+<2;eZ_9!dvwsU25u}{+bd&CeA9&5$CgXocs6>J&CZY& zxTL9E-m6`%_g=)a3gyI3atlE{20&qIq$`=K^M|y;SOk)=3|gcmul*hM&sUr-p)BvM zyh$jNnh~qkn28`9o~`VSNRD7gv1d#OLL~e|f2&6~}mf86yb32C<35pB9H( za<>Z7#f*u5UD}UX+jAGkWT=pxA?z5lOxcR1eJ0X$MHR&o@2>}8tiLh`)Bk)DRB?GI zr^}7J0{)$b4J}1JPgBr~8WCa>*Vm`#duWiq^k%(FYp40M!|$|^m4(yZVOBKnNb0@t z_Cy8jl=_Rs8Lq{(FOq5Je)PW0B(R)m{519>%6tC!4>?&`qi+Xgl;NelAEP>Bm!Zkz zRnak3)Ks7xYin+r`k8c{rE=3{U;C^W%PveyNE~&>a;xfGi73Z`9PQovaF02mJXnia zdR_@_f@%Onw9}u<^8O0()!Qxj{cQAM^Ocig%_M`^oI&1J+;)J8+EB@%wn%bQKw(F~ zDYeWIbxieyq1cEjbka69Rd*4bAp2-qdZU~b}~7~ z#JWnlvkz58TViR&Kb48wES~-G(ubkc&*HeXpMx5z(a|$|s%8qdLBnuL1hQFcmr2~z z%~Io}0_#xauYXYkaGQRYjU!aV@bcOcRo;vZZlPtDvYPcjSA5A!8B&itALpy*b;mNU z@-xZB_XP(rdHNPp+2%@K{_p{gV58GJ`-IGXKQ?Fbi0J@CL1LLK9 z0@%&P2HSE`=U3Cb1*f^GShNr5vLi1Y>qwa5%>?cG87MXuK`l@*E-#pXpsNTO2doGE?wn^f^a6 z*LIS2!QdVdSP9-VQ-+u+ZrhB??$$fgwp4t8gDSCVWU)15FO@$%S&A&030NDrK0m%f zL*kIJ=dnkh{A<3&(+{=6q5?$)`+NhD4+=L2Z0bT@gz^@oQIc(% z#VPokT2jAVI_=fuk}CvV;u=xUwL7zV>(cHp*NDMm7FB&>L=;ajto>@|i+|Z69CP&j zF~d0vB3EP#lkkMYgEGCY>~fq!k2lL$jN<~9AOA~$@Q(XIZEB*YHKneEA}&7@C->=c z3q59KqOzk+!;DysT{RN27evOFN+e{zo{Y`h#}SNz9ZrI5`^d5^-#gPu<%|YWsspmu zl<|o=%egq9e^nIm*CXW5XGVKvB@x4>Cxtx7Mh6S^h?VkQ8}xPm2M*QJV+oRuumY!1h%#R9UrlM*AXN8ZEy1BSU+tra^Qg^P4(At^_}9@k+e(g(LKtQ_jQ`GY{KS3#q2UeU27KPSf_FmHz(i`gctfEPa-ds!!Pb%_MXOK6 zP?sqoa3>DX-p$&CD?8^pK)085^cwP8lZ#xF2Zug5)a-T+U$40@SSNb@^}Y-cA=v01 z3+l@oegg*%8`m}MMBtU+)$W`PJlS6L@I>IG6MwhcFz@gn@2aq3Y&E){-ss=I@^z-c zB)E1b7|7as(2}tn7IXAHh+o7&7z3giZS2MQ^5yw9p|cqf+fGQSG2d5Vqm#Kk_+}?e zi&kE_A&Y*fyuN;bGCrTDof)`YvYhKG4Z^Lx@$i;=S?Ez$vfNLI&-jcjl6Up9Ul7XT zt!<>myIo6GouOXHyNG}+RB$N*R%gA^8>EE|De&u^jKjESr zAbmM5S?0QqDu8yT|H+KFr3;6G6uC_6_@K&PkCxZv3XWhY_%DJZq6dT@L_B^rcov1n zIxX@9kDLUSY&Q;qu+7oNrfyPFphMaw9EG~f4ZgM^ZhOmW&97E_e=Pha+<{jOWPEVk z315RQm37Seukv_8Y|`-db0AZQc;_L+!w!QV8EF&e9t;g1>b&-4vs^FI>5LV&DJGH~ z`!C zgLWRti_UcIoRj#mSB4MXFA>GK&UpiVdF8~3f}yukUq9B zPs9YM5ZV?e>b{acr7c3BLc(6O%Nx*i704Dg~d5Dy|a7yO- zbNNB}#DpZQRb5Z%x7TcuP8h`MayljJ(g8w~K_y~~VxF(Bh5PhTb~c=3m84&0XG-t0 z9g4{>bJQvKB+L~#bTaInA(@TGEFtRr%y)rZOtlay*3#iTVRFkWkp9iNFMX`T>Qx8h z`+yfEm4!e>8>H)jt)i4nN(Q@9riwA~Zh6i>lrYbZPi7Yg$dr{7U(`w(N<>-UC9O-Q z-g&J?_hsxPixgv?%q1zy)Q%rgxXM!Kue}e&Io5T|t30B;9IEyn%%COv~L3Ek`b-1cBKFJZ7m84$C}- zo%w{0iK9Q)B&$r#1>Ny+u*3(_o)%4}GdGw(S)mIlD&WhN;LD-sZWf;o+^nZXhH@WF zlrTrWQt|$38W}3Yq-On?Wu>bzc;pNc;)DHVN0pcLn7Vr1+Yj@@8=7=F2g+r0H{ns~ z@Y#%AHOu=r{D8D+>b}s0xr>`K1=815ZRrnX9oKhUD(!Q=+veU2(DG$pnLu!B#A6nj z3Dm$x$t`lrfo@_n(p>kLpwAFqE^zd{3!$}TjTIuCMkWXWje(4b*P(Cd(`iAUiBFno z_e>i6Hl2Q8pw#qkkk69bc`CbgXKbKlG zJ?HfNEYx*rMBS%I*6zYS4m&n$_qsIaIp9!dHRidEHAz2a3*M(qp3~)8dmxh@Lxk)PTqB#*wQ=v1i*PZ8V)c?@N%3-0)zuF3l z;u=AoNfKx5Ndti+c>S*j1J;9;7*G0?mg*Z7>dWX03?-1xZ0>>V6hYoo@Vz9=L z5#vYT=<6zuB56M_vwJb#>ewqClhvJ+!!d7q z6V>XarSSu}=-vPcJGLv6)$r#?fhX|w@h{o$(G`c#g=8?8ok8&`JWrq zlh;HV1D{|f z`9|zBEm!v|bJm0<)5(0~sgIihA=ErJqjFmIDR>-tkmJpNZ1T7ZG6q;K*0xaQSHf40 z2r{Uod=QwAN*m9dL5f8OOcfpHw72Y3-QHBqX+F99%+cFF_v$y{ljo>ir-Y`Cv?aDT z?uXba%D;x7G=*XZ_tTcR>@7-H{HrA$+r6(~l)pcHw$eFqZ(qW7U}Cq8S}sa_nYs{9 zRweOr+hvyTRa;hEXHyZ1s1{)B@Ztp(1*Hkab= z)s4@F=Nxu@OWhOeZBcw{G!We#H8pX9jSVCn5m{5a<0Xo(HF_GoelNo(SyW}@)YJE{LR~nZ9vW*4bvADH3hRsL^HcBZT{8HJ6H0HDyJ~%jj4={L z26J-n^DVpV!p$}wXP+DVE-vT^3rKhGUAr=N;>WSm!{#cs5}1%vdEZS{nCOwv>H6$#M@%`{1!e*C*@S39mYN3i9|Ky(qoadYW<6^~D4t zwY}%Q<*1uX4)9W`t%9TLAnp0SkCu0E_DaLeAZx)9b)h@DrnOD-7f23L!{%j|lkeX; z?slhs6@qXrgL`MchOk1ZQSC~@xSk43;)ww!(?=S)M*C+=B*xpK55sA5A&N(YR}`pS z-RO0k#HXB%1?uF1dhU(v<&((f0u`@Mg6~Yl4hxs>Iy3I4*POyPiB^zs zRoc5L+(K#taFSX`Mso+ed(%j}zFP@V(}5X|Ol$ldJn;Fr;czwh*@ z8wb5RHE<@+tNX6=X}2aXI@?)Zc`#F144HVHPIP@^>*M<(IyPZ?S|bj@C*9uN<_*;- zw#<;c1(y$*FQ?_bEae0~+gHobFe!78^Eqv1FjDF*%D1cCKlJt)umfUPm~f|-FzE`t z_nrhWz|;bgY!I{GdCyAc#{U`YHHrm+zb|~c0GnCy`xA90t*HBYVtO2+gyZR>1xWMS z?mcA7Lw;vXHCC6jJzjhb+58bgd1aGa0YPK$=veehObg*@L>TSHOaC)5nz`4Ah!ax}|`0Ld1>i8RIvU0&G|AQRV z*(kDsd9|yM#cpV;&xNIYb3n|IR&X9&@moLnwV}ChS4&;aZC;@1E93a{GPvgw*uUK? zlErd>s@*PT@vX?j+3@p1YHRdkLXWc$9s*WZ;zFpJm(KwUJ_L@^1hp3u=NdP3!w(2p9v9gTpIM4MH zc2n>3V%*G&6b7oK;LSG>`Sn4oba0W2Qmxn_p&Hg^rLC$Vmv~b7p*Z{eIglU=GO_{& zO@A6u;wL*po^BqE62n=&dq!^b&$dv27Me2ng~nH~v6VI)c~TeZpTy)q$6v+ZGZN)> zVtoU1OAMctTvlic1qgXC=L-@_24{KnO=`D3D5^Fd^qLzS$gEh_gZupodZL)7Oh8>xxts}ECVYqGe6YF>oD zud>4QE-tA7Z%lp329T`FCY5>lSH@3^Q@ra~+w2EhPwvkUFRT*BLR0!ZxV-6JeeE6s zakKkI&o=JItgNl6Qu>FXyUx{T7?w6Rx!o@^G|lTP+sWkGYv)umn*4t+XSYH%!fn#LCUIHO zX^}5%Q>HXci9&;i(f$gvPdpOShf2a$)i?936L&WPOb5LF&)1@OPb%b*UIi7;l1FXF zX2JvuGCFZ(AJ%!Gu3QlGbT=lvkE|5~+T^|ENs3yI7nQzdnG}?sa6Tx>pAzZyo1#O= zsYnL-I#ku&C{`>x*WI`i_I(@jo{w5?F+Tbp1aXoemQ!G_j;Rh9eqQ9e@&iOMhCHqj zE%J?z<@crmB+lX9XwocY>e2yGiM7Qt#KP*kweFz~m znj*4!OSZGi!nuW1<}f z2h7UW4ncb(<@d5Fj4&-|ow&8VO6Ko|>u_+Y0iX~#Uv#h>%W2H#v60T$1?nmM%uhke zch6-@qca1qG}-7iux6g=FBF)cfKVK@sgskkk-L>G?Pf9u)jWiA4uDi-z_4|PbFQn+?#tZJ9t3_+Y zAq@gm{v&Y;guIxx%Bj{!I7@W3VtN+JJ^R{90g`zGGKq%(>`Ou}4Y_rH8cf!m1Qo?V zdQSu8Kn(X*zp725l;yHvx${;@V_b-!|Ehxc7BdU!I$mir$ZxHxj9WTe0?KeBQJTU{*~(PIPxa3^n#G~ zxN{?9U0f02o$q&>_}1HJN#o7L67r)`LS}OfHG|`$Grj# zpd7^bo!u)yPk{hc67I4IWgHgrYHnejK8_5g13XD3rHUO!4B&A={=Wh+-~cs$LAs7_ z*KyI4Ab*FZfrYFGuOh%2q-f}C8gh&<^=SD*3rw@VkkVqRKxOrlVI0bNI?q93jjTBEH+4QJE|NDgMpOCODJs^`xTUPbKe1Y zPa1p?-zvp^IkRJBZq@D@JKo`zYNfJu`9keZCI6-9T1KA@w&LcAhyrWr$|U&*e)86y zORv1XODklQ@#w#YZ9&kV-tE-`9EAfG+k2-BA&72;tpv6p7)iCox*L>Fypp7J=v5G+ zlmV5Xc76Ii>iIk&If#58%~f-1r1sa$dsMie9^OSJ($V)2%j}yC@Ao^PDH#Atop^+5 zd&NC;Iq(~i9c=?FKIx!XE~>ebo4f_QQ>&6FtAKhgj~I?*`y{V$$G-rk_VsE@e(D zN#}r>a+1{B-^<@<@sHW&(_j zV`0Cc!?VTMjdz|2hv^T5;Xd|^J`yr^IB@*pyp|~2onbM2mFF#`| zmba?&uF&%#Hn!L3K2GW((y8v!JaWf&o>TZP1vz|*gDB!^9D`!t|ojwB_!QPN^ zSFgwb--T~;r1!#`lT{Q4QLElBe0+j$OF62{H;eJ3)6=eNbN2+Aw*#rc)xT8d^zp+q zi$!x@mH!l(OXK>F$XuNkakruBNbT<%rIFPy4{`|oq+Ui$Ho5Sxby$^c7TywWJzV!N zzsgaE4r5xAHsw;vtFbJNvPe|f45d*l1U`+5{Ki%RN?$hi$eQwgKJWezvw|!%$c($8 zz_c8_VCS7R*x1zkgyp3#ZYidC2UAB`ZOqtD+l6h^ZTA5h1~~r+Uz%9Z-%M;WMHQ$W&hK+@!w`#6T_vlWq|4;j%h`L098a%`{i zF`o*nR4qT9g>iRoX=Iw}(JWLhH^d2FlZ!L$7$ za|gmhIoX$bH(@*(w~MlAAgHT?;(-^b;HgrtgW^!pZA*Gv%h)V1K#7cq zD5W{lYdG|BCXf3+4&o0lr^L3DJ2w|7GJ&wrP!-MZsKFyt-&w!aZ=NsoJoL-TiKG+4 zYp4TcZ|vJaL#;MU7Nw_>$|=k&AZ&*n+oE)EKi5btUK)Gj^{koF5*(tg3)7ml%B6(2rnJIO zM`Qw+RAIH&WMg!5sdKwdrDFVVo#)xaveD-fjF0(ZIF%b8pdQF&&jlukI`!Qx&v!kv!uP$U4T65NtbkqUjy89BZAdAi61$J$i;QcH*y z8u)!~J&G$3lWZE+B_jSpU*ah%4`ScRgiD0Hp0uI^DUIp^P2@mMQleSw!JpXx>)LJ6 zdv#VjU=3P#m@c7YSCCBenJXmghB#&}A)EQfh_BquRHjD74V1{BRuZqmhc#tckr6IR z`w-9d-6V3&$b6V*R`W;fnw#m*8~T|QXF2Uy5AD^;?aU%{=hq?GseV<&Yr!7Ox%bD7 zFZ|3{3ViQGe*A`fO$7vqn$dnfDP(Ss{i(M~!vefShgWXpkQh41oaw1`P}H6KTT?z{*Hw4fk0a`AJW){(*?i6^+)1rBtxgciHp-3i zkRUrT#S${^hE|x4;jOg-%BgGLb+XIL2ekif3MPG%N6hy)+;X>?G;bOE5|JA&yNu@| zOGMG!d7EyX%dLz8FtC{uiwIutU0=7rOB+5%lT zFYVU02j0!2c2XP;DAQ59Y!}75x#YDQ<;Rh{?6k0~zRt6Vesa{N$!Yx}V^cO-;gQih zq?R>##94InnsGsT-_~2a52;{BLCYti7Vnvm+dhbYKlG+mq(_g~Q-+JR`Rgl^_d%~6 zGp`fb^G>V{I0S#(r&YyT4IdTcQN|Mxbs>tunTRZlINx>?7K@-mK1)}_$ZLM5PxrhI zZjeW7_{s=Sxs0TfjTx_fEJhXcw1bw&jXnj5^R9wSmx(7i5ZSD`G5i|Cw{ zR~)02?}V}8j*av*3kuiuhG_U6F)_SCa_q*1Ez@cnTO>ue8WO#f`PD0%C98%DfOyg6&XZNeqm zWOq2#BUSxylQ&HglaB(Sh>Tiv!e8)AxTH6>MHP(xgdKGB)*) zm8?El_$`Mk;2EZECNjoaiB{Qun6za^dU?|)iBY07k$IAoAkW?l09SBH%zDwC#GY(shC8^lIaZUrL1YBA^RTxY=hL7eDlSXl@sMN z?8lfi)oE78P8ZY-#JT4WwhkJb!$#?I!=7kd+`?iF=A@7wzgMd{)WR&VnWip)%gN?D zLvuMHn5$DJ*Naje-zedseexr&EjM}TUui$zdmSZ?VZr0fNVIH#7`xb8qr>JM!4kyc zJJEvMd8<#@JAXB+ChF@5NK`dPx8#huc1>q^R9O@Yx6aHj4-r~sIdOZFps}3Zvd=N+ zJJ6P@bZgGXv6J&fUZ14*_8W$>(A0;d+V>MKi7XxY&^Ie7Azf~?0Z##P=X&DFmW*1_#%qQy0o$FAM#jq6@#zc`tTF!wsiVP!9TUa>V< zPa(Z;ubEdsTU#z)(4~85V~qd6lfT?iVg-1DrXj;-=`iVgf@pOz+Qxks@9DgbWLzw) zt+u?+ByQJHvApRI2|{h(2A{W+Ib5!(1pc<~l4ov?WSL59hA9 zcyqKB`wij|x;r`}dvM7zfW6un68`g4q4#^;1QK(M%r z;WP3>6o<_*WwWuRWqoLa(z>Q^tp?}Nf%@*L5$tYk8c}27`ZvidMdI$?ip~=q&SKrr zl*zbmvlFM9*K8|}Km3+YbvlwR<<3@Lc$AcGR>!$?c&S(p$T|Gb#fM!C8=pHo=rukW zCWf|>Waj0jUHT-IW>MO%iO-FzjEd~ePZGSNEbNX+tBiVj#j1Dey=P2(4u_vS$Ef1X zjHRG~ILiCmgxLkz&!e8%OPw_Yvxms-=^hjFTz zVpY!_@G&Av(jh}Nt$ie&uz5{E3*2WUGt;j%>XJi&W*&i^eq5LAHcY13#TS5lOEZqWNs!zJILfu zH549dx+7)lQ^7R=c4q*M5GS44*WJ<_Vn(`MTl-4_Yh#olp*oRPzb3(FJsXuAFzkI7 z+@D7GKf5THty67XRjCzhbVEf!^L4&a-r(MMq+b1M+kxU@mj31FFPDRUnF?MrZc&}e z=360p*#ikW;zIWpTi#_1`}MY0+ppG7-e{UULc&o!MiX4Pd1J{ls6Q(pjc3Q$59`x5 zNV6)DTd$&j9TH#*r8*sTEKeOVw9yweuWeg0?+p(zQHaxGn7Vpmh_fABRjq3}*7KZp zKjS(hjWS%Urc3&PVhFCbK8IE+eW*BVw1{bok`nGc5(u-GA|fUInMnBHVBL4Fcv{XPzBaKMqZopyJ{$8E@sAQCSpLU6i+ecpgx3yJjMI z&6G;^>Q?J4K$r>M3Gq18G|NMFESX7(;~1sP5k678*As4$JFDV5&)VvX9-OC|Hi^wf zwNr$2X!5=9lFhaEu+$Z7_FsLSPdz`nztM!c6wq6ENepew8=EUfD?9O=<;<>4o1mb# z;B(DlRAOF`xzs=`86mH2jb788DVylzKTIHw(Bht6bFjAn#lv1PQ{k^E0`)Y;{WYPs zLCdBpd75A7O0XcB9Age*f+Un#p!68;w~!FAS^bX$8~Y@^l7y>+CeD|QBn$a_M%$Mr?#Ot>C+P2os1vpVV9`=~hw$j>fm`by26MG7P zE;qulP3P^g7x5B{+p>~)aW2OM{+rO&i)7JE7lG-Lpp}Z&wg`E9tD5KNi!;Syg>St# z@`vz(@&wh<{e_;bN@?&cydJc+y~(LpAHF_$oUK(|pzWSi!F}7fzCnue0A|b$kxoE= z7bcIL)Ru0t%9ZdnJW7n%+F&jWVu0*j?rreU!%3*!_Wh2!% zTY|Im-V1dP=vr3qIspIqFrkIz@Jv`pb-=@ab|d%p1QntDY!Ln2gXScQyV2x-hu$h$ zhERzPz|3lUHe)ds6=PDW9SCA$fTdq=fkZkwAo|Ude$&ZGPTWtVor`Je@uN%LenSWU zsL{xvDS#+nl$w9ec54^xEghvbt57o_2%+Z^_evKsjCkV)200bZdSAv&_AaVxg&e<; zyjc^zav^k3A&%pD&T$bkZB(Z_+an}1>U|b6Al>>Cw{6FS-xwYzbgz(9?wUe&{7LwD z+nl{~6pvpPAP6mpM>Sn{PQ9oiNqv`%(zvkbnxPE-lUagkvL1{jtTOFfKl7+f~KirxN#1HPvNi)x3MM!^&*) zK=~R>rv$+8k!?OVBL$d4Icf{BNuUQ=U=#&FuYe7iu~Pz^{66{o>=>mm(?%N$@V`P5 z$MW6wK&5Wmq)HK23_Z@ibsa7y{!@BQI-8-k1~{9B#0%GnyJZkPuJ}xpi<=nA^2@xr zeJ!0WeOy%_ zq-(pCnMg3;sql%UXD33u7pLVdj)880h_*+Spuv#RS?z(|VQ%i3_Gz;=$TUbUSKRXJ zb7_eE&NVN2W84MRe?#{XomhH{xVz?_QRz$ma$st~3oS7`?_IQt1D8pz3Og7mQ5y2$(6IPlut><>L9_zf0!(ZFQe81}|W~Zo*A|$&&p5qYHxh zm=5dxjZLdZj8nE#QHYhV`_Np_Nf;yTddi}=xRHomisbL!vP_cBV9UI=Vt=og#N}8b z;5&o!8g`r^{J$#4&bz}&wm6s(I)MFUD9e5K6)ayG%3%tKr<%T4Cif~Gu1z|VX7G|3 z?4eUbR_C`F%jQe@IzFfYYXCjV0Y+`(maBQb?}vo*$O%&AC76ZkTr1wGV7K~5=Ov5s zheyiTvaF)&jd8@))u;?RK>-Wzs8-vA*! zu6i?%oANgKgI?!vhMp|<-cG>X)x-L9L{f_83xt|QXB(H;I=XuOuN{`f%eig ziSj|3QpkILzq8}{){srigi%ULK^4P$F}|O(?oPfH<0j(n@TgY@ASbhwR2pvX*-NT# zoTb#yf6x^TbTcgnMFY^Q$)%dURE(`Yjq_!+Hg@WL{b;DbBy+#VbF{S|+*Vp~q<=GZA$d)^lJ~ys;p0M@ zzW-@O+~HI`j-$dnawHwK%dRJDP?OXg$^v&mJ_K7^YfOz1-oi}(AUvFO^n)K#xp1u4 zKFSZt_$CqQe}AVyXQ02{*@$(h!Us|0uD%5pWvA-<_Kg8j1^2+-5XZb;BLLZ zGY)`?+*nQZ#>>g>m>8BdPk+)qy=epMC0AtB`x`I zi5Q+deJrDwMv;gSe0vjx3|sy+DAZUxZ7)rPVX@8 zll6k)8NgZqIVGHrF#0G0aPsd(*n9yL{YVyJdc*Fi4=8#J9j-4{zATnC;K=l#3i_S`|}E-2(fPh%JC7Lfn3{EL|T=1BQ1oTnErrwoJKj=7$ygceb_^HNcG~uJrGHgGU4uDE zi1|+|&i%6n8BR$XdWG^(!lj*^^EIUQ<0P5cnbDp|2%9X>O;&brhKt*jAO0noJT{om z328o@=X7+rd~cqXzEb&zpgQ#s3+iA3a%DL2w4gh6>6|LrPwaK0*N9t)VQD1G0{U&>?b)G5gETN`$rJLUg+ z=m7@=Gppd8D)V`?Hq;j3gFyiAzC(ff4@Fd_-~m8UvAed9L_L}%+R6$ zs+JV!YzL=vEOy4|dkS5&C4VF43NWt~zD+YCZ4@?aBk9Eo2J8g#WM5fWe z;dR5I5Po>Y0<^f-|I;6#un!`FE+*KPdnN%5O?xM(0mQVU#+rRGN;Z1QZz{y{$~RsE z=9{kG9|amlOQ3u&{3#_)Re^5!!Sby*m{jEqxNxA`Aq&K?!N&nJg*Y0Pw-com;4xVV z=T$(p@M0h}b`Pb*-{*)il%o8{v#7h75m$8KRw0coas*6%awf4?*OS?gujx_ z%E1Vv#k5{%1J6>p_;fzH!q(OQ61|OuVJT;-Z~yMx2H86ZY2DDT8HsbdZ#=$Ev!UsKDjMJYK-I$&nCh>5ru36SwQHjeK~@NV63DIck=4%}dfDNdnZLu{Z$ z1(JD@I@X_~G2nd6iOk8rG|?`R5p=T}o5^2d1zP!qE%eI(_eT?cv;prm%%uF&+NL7? zR>f!pD|wJJ)sv+CJCn-5MSYQcR~Zqo`|=0o;O}rV+TI((WqEu-ouP4SmdNdtIO?-U z6qS>y$gjtDg$En~j}Ni)0>cJBI)zL~^4+VB!57ce#4FJW{iR%7T-YKYSj`md?wPOq z$|%!ZSdVtU-5Q{g+&rIgwH|wdy7=T z$q8pEyi{QlRV)~QUbas6TCtZuZ`uI8!VFA^?R|M&$kg(yf)WGMR1J_pmu|k9*d$9V z&1yf;$z-}37ofUgkulIo4ov8jKtjBr-ygCQ={+VizBc7!LH)ivFLpB8axe8eo9XF^ zSyND}$VtK;Iw{|}G_e7m@gP&avw%5r$maOoN_5JmOf4t`9W9lLoy6U*B4d{H1BP}T zdUW}N>MQH&`=oQ12mwzKctBK>ESnLU5&lIBgLOzNjWWy|AmA3tcWa7bJV6!`ZEPx-!5N+rg6 zn-3|)seVq$;j&7S)_yFIhxnnF_cbhsR>9eJR=Skv9j`>gMNBoThV$xu2PR?X1yk=H zT}T{JXLyF1mL83r3^%mPd3o@-aG;^Ns1nI(w&XNw@Lq@UN<>HoHBZ3wHXwQab5#%E zmCd#KW>V4SPdLdmMA>s;dT&dIMzl8qBX!vrW0|>M>)$1;WF|Q`RkClfb5QkztZ~0R zCab371zJn>Od@lhrKBL;6x209VDYCjpE)~uMBQt6tZZ-Lx6M9oi#V{Ln^nENEmEqv z@9tY7tbJ&!PxXaS*!UxJnl;T*e;}3=_X&Tt@z(X^+;-U+0ycjfi167Pzd}m3byy43TB4; z&B`^p`oxR_`qrnMHKJbq)7I5}UKdT4M({KQm_oU<7Y^{OP#)u~!Qz=Ptj{ ze|3v}Pfm#f-t}G7ji!y=J5A2Pk79j3W&++i?w2p?FB2-7L&Nulv?r-Lu)$X4TuI?2 z1JR9Ce%ie!h+!Tm1TY1G2$gb3(A{IJKa?*M_eBA}`Q|n&2h|moDIjE0RX_pWIznp4 zPfYLU7~LO$x#WI8qav63t~X>?=y9Z&&rmdYV2Ay*utY)WW<&_$-%S$zgymg8v9h*T z{@Cp>Jo_f~&UQT~Tr6LP#@_KND)5dE)F0aa+A zu74yR&16xkqLZ>&_l&A+d&nF*{e!EH(S{>ZT_LiifCt$XxxKj*p55De^7x6aEQj4{ zmw25^E2$dXxk=$N*5u%f{IxxQdbtn!Oi=VJjeEEkt4w>xS&JExX?+x0mW0Qtt=_d~X7Ld$N zCnL-Y0#x%17&%Jt`k#=7S@=mtJ6Ho#a0l27(0+;e0K`rUrQq89IY4Eq5XR&$1~(_l zKL9=ZYLmcVpwr+nISFvUL2=TN=Qe&y>Wo);%b?HbbnhSoP>K?8qQT!lU*~mF`2%aX z&l8j*z_WP-RRC-3#Y7+$4F@_q5417)6V{|e{^wkAOf?f!1y9oCS?(ICIzR(t&k~^H z^S4w6dp?MdT_3nay#2Y;gb(dRTq(>m!hZ5w#7hbpglas3xHRS2&{NCVDW?c$>^hTD zZo63_L%4xkjpvL!%0M*8$q_;E&+P_bp?F3|Qg6)Q5{!cABe9NSlV_M(>j zbUdx`;7;!|Xb&~;w^h3N?Ry0Xd*z6TvTxz}LkTMWjiApU#8+fAsRhkkqYL+r_l&=u z42pp}kl~=30=QuMw(DS+-{46@@sfUG#G)We2d}SyU&>$m6<~1hNrFMDRU5-2%k;!h zK7zLjUKM`ofkpLP_D(xA{LHB+K#AIElwJxdSCO<{y5a{jxLhF_Pk4%fht+FwiQbuD zL;THH;aPicEOj%kdcB=YfeBe@`nM7o%M#|9(aFB(|B)9i>-UEj9x%nj1@Z0%%m3f+ g* Date: Mon, 29 Mar 2021 12:55:35 -0500 Subject: [PATCH 05/10] Fixes #625 (#660) * Fixes #625 * Improve spelling, grammar and clarity in history.asciidoc --- contrib/history.asciidoc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/contrib/history.asciidoc b/contrib/history.asciidoc index 192db97..a26ffe0 100644 --- a/contrib/history.asciidoc +++ b/contrib/history.asciidoc @@ -17,7 +17,7 @@ A key requirement for a second layer protocol such as Lightning (which will be d The `nSequence` field was intended to allow users to transmit updated versions of a transaction to the network, changing the outputs of a transaction, effectively creating a payment channel. Such a payment channel would then be valid as long as the transaction was not mined. -According to a mailing list post in 2013, by early Bitcoin developer Mike Hearn, Satoshi Nakamoto envisioned this construct for high frequency trading.footnote:HearnBitcoinDev[Mike Hearn on Bitcoin-dev - April 16th 2013 - Anti DoS for tx replacement http://web.archive.org/web/20190501234813/https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2013-April/002417.html.] +According to a mailing list post in 2013 by early Bitcoin developer Mike Hearn, Satoshi Nakamoto envisioned this construct for high frequency trading.footnote:HearnBitcoinDev[Mike Hearn on Bitcoin-dev - April 16th 2013 - Anti DoS for tx replacement http://web.archive.org/web/20190501234813/https://lists.linuxfoundation.org/pipermail/bitcoin-dev/2013-April/002417.html.] However, there were some weaknesses in this initial formulation that limited its potential. Firstly, the payment channel would only be open until the transaction was mined in a block, either limiting the duration of the payment channel or handing control of the payment channel to the miners. Secondly, there was no economic incentive for miners to respect the `nSequence` number (to replace the state of the channel in the mempool), reducing the utility of this mechanism. @@ -25,7 +25,7 @@ The Revocable Sequence Maturity Contracts (RSMC), which formed payment channels Using this new feature of the `nSequence` number, the RSMC was able to enforce a novel penalty mechanism: each time a party goes to claim a state on chain (which may or may not be the latest), the other party is given a period of time to challenge that claim (enforced by the `nSequence` number of `OP_CHECKSEQUENCEVERIFY`). -If a participant of the channel is able to present evidence to the blockchain of an intent to claim a revoked state, then the honest party s rewarded with all the funds of the cheating party. +If a participant of the channel is able to present evidence to the blockchain of an intent to claim a revoked state, then the honest party is rewarded with all the funds of the cheating party. This enforcement of prior revoked states (only the latest channel state is valid) created a very strong economic incentive via the penalty mechanism: if a party attempts to renege a signed contract, they lose all their funds! @@ -50,13 +50,13 @@ Alice cannot effectively broadcast the refund transaction to be mined in a block Therefore, Bob can securely receive more updates to the channel balance as long as it remains `open`. This mechanism would allow two users to engage in several smaller transactions which all happened outside of the Bitcoin network. -While this construction of the unidirectional payment channel would have solved the custody problem of exchanges it has never been widely implemented. +While this construction of the unidirectional payment channel would have solved the custody problem of exchanges, it has never been widely implemented. A fundamental blocker to deploying payment channels in production was the issue of transaction malleability. In the worst case, this could be exploited by an attacker to prevent a party from closing the channel on-chain as their settlement transaction had a chance to become invalidated if the funding transaction has it's transaction ID inadvertently changed. -Also as a payment channel this system was not too useful as the channel could only at total send the total amount of provided bitcoin in the funding transaction. +Also, as a payment channel this system was not too useful because the channel could only at total send the total amount of provided bitcoin in the funding transaction. Once the timelock was over or all bitcoin were sent to B the channel would have to be closed. The obvious idea of opening two channels one from A to B and one from B to A would not have helped as each of those channels would have to be closed and reestablished once it ran dry. The core breakthrough for the Lightning Network to become a reality was the ability to create payment channels which technically can live forever and can send money back and forth as often as the peers wish to in combination with routing payments among several channels. @@ -66,8 +66,8 @@ The core breakthrough for the Lightning Network to become a reality was the abil You can watch a video explaining the construction and operation of unidirectional payment channels online at: https://youtu.be/AcP3czefanM ==== -Surprisingly both properties took quite some while until the community figured them out. -Technically speaking the unidirectional payment channel has all the important ingredients (funding transaction to a 2-2 multisignature wallet, a transaction spending from the wallet encoding the balance, a timelock to allow refunding if the other side becomes unresponsive, off chain communication and the fact that no additional trust other than the one in the bitcoin network) of modern payment channels which are used in the Lightning Network. +Surprisingly, both properties took quite some while until the community figured them out. +Technically speaking, the unidirectional payment channel has all the important ingredients (funding transaction to a 2-2 multisignature wallet, a transaction spending from the wallet encoding the balance, a timelock to allow refunding if the other side becomes unresponsive, off chain communication and the fact that no additional trust, other than trust in the bitcoin network, is required) of modern payment channels which are used in the Lightning Network. Despite being widely used in today's world, we will study the unidirectional payment channel in more depth in this book as it is an easy to understand educational example to approach the construction of today's payment channels. This setup has one safety issue as transactions have been malleable without the segwit upgrade. A problem that needed to be solved for any payment channel construction that we know up till today and which has been fixed in August 2017. @@ -85,13 +85,13 @@ The key difference was that a trusted party would have co-signed the spend of th The Ultra Server was not able to steal bitcoin. The next day, probably in response to Gavin's blogpost, Meni Rosenfeld started a discussion related to how these ideas could be combined.footnote:[Meni Rosenfeld on Bitcointalk - July 5th 2012 - Trustless, instant, off-the-chain Bitcoin payments http://web.archive.org/web/20190419103457/https://bitcointalk.org/index.php?topic=91732.0] -As Hashed Timelocked Contracts have neither been invented nor seen to solve the issue of trustless routing, Rosenfeld imagined trusted routing nodes. -Without mentioning the term network or routing of payments the idea of connecting payment channels and being able to send funds from anyone to anyone else even if there was no direct channel was born. -In Rosenfelds solution payment providers would be the ultraservers and they would settle the transactions among themselves based on trust. -It took us another 3 years until the Lightning Network whitepaper emerged which had solved all the bits and bolts necessary to get rid of the trust in Rosenfelds solution. +As Hashed Timelocked Contracts had neither been invented nor seen to solve the issue of trustless routing, Rosenfeld imagined trusted routing nodes. +Without mentioning the term network or routing of payments, the idea of connecting payment channels and being able to send funds from anyone to anyone else, even if there was no direct channel between them, was born. +In Rosenfeld's solution, payment providers would be the ultraservers and they would settle the transactions among themselves based on trust. +It took us another 3 years until the Lightning Network whitepaper emerged which had solved all the bits and bolts necessary to get rid of the trust in Rosenfeld's solution. -It was 2013 that Bitcoin developer Mike Hearn referred to Meni Rosenfelds proposal and suggesting to reactivate the `nSequence` field which Satoshi previously had deactivated.footnote:HearnBitcoinDev[] -Also Hearn referred to a section on the contracts article talking about the case of micropayment channels with the help of `nSequence`. +It was 2013 that Bitcoin developer Mike Hearn referred to Meni Rosenfeld's proposal and suggesting to reactivate the `nSequence` field which Satoshi previously had deactivated.footnote:HearnBitcoinDev[] +Also, Hearn referred to a section on the contracts article talking about the case of micropayment channels with the help of `nSequence`. Links: * https://en.bitcoin.it/w/index.php?title=Contract&oldid=36712#Example_7:_Rapidly-adjusted_.28micro.29payments_to_a_pre-determined_party From 77129a0a897212f6675e9b407e5d42969abb9f91 Mon Sep 17 00:00:00 2001 From: Sebastian Falbesoner Date: Mon, 29 Mar 2021 19:57:25 +0200 Subject: [PATCH 06/10] introduction: fix link to "Bitcoin Fundamentals Review" appendix (#661) --- 01_introduction.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/01_introduction.asciidoc b/01_introduction.asciidoc index b66377c..f73dd8b 100644 --- a/01_introduction.asciidoc +++ b/01_introduction.asciidoc @@ -10,7 +10,7 @@ Today, in 2021, the Lightning Network is still in its infancy. The Lightning Net The concept of the Lightning Network was proposed in 2015, and the first implementation was launched in 2018. As of 2021, we're only beginning to see the opportunities the Lightning Network provides to Bitcoin including improved privacy, speed, and scale. With core knowledge of the Lightning Network, you can help shape the future of the network while also building opportunities for yourself. -We assume you already have some basic knowledge about Bitcoin, but if not, don't worry – we will explain the most important Bitcoin concepts, those you must know to understand the Lightning Network, in <>. If you want to learn more about Bitcoin, you can read _Mastering Bitcoin_, available for free online. +We assume you already have some basic knowledge about Bitcoin, but if not, don't worry – we will explain the most important Bitcoin concepts, those you must know to understand the Lightning Network, in <>. If you want to learn more about Bitcoin, you can read _Mastering Bitcoin_, available for free online. While the bulk of this book is written for programmers, the first few chapters are written to be approachable by anyone regardless of technical experience. In this chapter, we'll start with some terminology, then move to looking at trust and its application in these systems, and finally we'll discuss the history and future of the Lightning Network. Let's get started. From b837eb9569dfd4a41c31ba45b63851ceb288669f Mon Sep 17 00:00:00 2001 From: GiovanniZotta Date: Mon, 29 Mar 2021 19:58:30 +0200 Subject: [PATCH 07/10] Rephrasing, typo correction, addition of a detail about computational complexity (#665) --- glossary.asciidoc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/glossary.asciidoc b/glossary.asciidoc index a50ee1a..a5f58e7 100644 --- a/glossary.asciidoc +++ b/glossary.asciidoc @@ -129,10 +129,10 @@ Commitment Transaction:: Submitting an older (outdated) commitment transaction is considered "cheating" (i.e. protocol breach) in the Lightning network and can be penalized by the other party claiming all the funds in the channel for themselves. computationally easy:: - A problem is considered to be computationally easy if there exists an algorithm that is able to compute the solution to the problem rather quickly. + A problem is considered to be computationally easy if there exists an algorithm that is able to compute the solution to the problem rather quickly (in polynomial time complexity). computationally hard:: - A problem is considered to be computationally hard if no algorithm exists or is known that is able to compute the solution to the problem rather quickly. + A problem is considered to be computationally hard if no algorithm exists or is known that is able to compute the solution to the problem rather quickly (in polynomial time complexity). confirmations:: Once a transaction is included in a block, it has one confirmation. As soon as _another_ block is mined on the same blockchain, the transaction has two confirmations, and so on. Six or more confirmations are considered sufficient proof that a transaction cannot be reversed. @@ -146,7 +146,7 @@ Diffie Hellman Key Exchange:: It is an anonymous key agreement protocol that allows two parties, each having an elliptic-curve public-private key pair, to establish a shared secret over an insecure communication channel. This shared secret may be directly used as a key, or to derive another key. The key, or the derived key, can then be used to encrypt subsequent communications using a symmetric-key cipher. - An example of the derived key would be the shared secrete between the ephemeral session key of a sender of an onion with the nodes public key of a hop of the onion as described and used by the SPHINX Mix Format. + An example of the derived key would be the shared secret between the ephemeral session key of a sender of an onion with the nodes public key of a hop of the onion as described and used by the SPHINX Mix Format. Via https://en.wikipedia.org/w/index.php?title=Elliptic-curve_Diffie%E2%80%93Hellman&oldid=836070673 digital signature:: @@ -157,7 +157,7 @@ digital signature:: double-spending:: Double-spending is the result of successfully spending some money more than once. - Bitcoin protects against double-spending by verifying each transaction added to the blockchain plays by the rules that the inputs for the transaction have not previously already been spent. + Bitcoin protects against double-spending by verifying that each transaction added to the blockchain plays by the rules; this means checking that the inputs for the transaction have not previously already been spent. The Revocable Sequence Maturity Contracts used to construct payment channels heavily attempt to double-spend bitcoin. downstream payment:: From 1f51de2b518f2ef8e403ff32c27bb0b2d6f8c19c Mon Sep 17 00:00:00 2001 From: Frnk Date: Mon, 5 Apr 2021 15:45:18 +0200 Subject: [PATCH 08/10] SHA256 of "Dinas secret" is 0575965b3b44be51e8057d551c4016d83cb1fba9ea8d6e986447ba33fe69f6b3 replace former SHA256 of "Glorias secret" --- routing.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/routing.asciidoc b/routing.asciidoc index 179a73e..b5110dc 100644 --- a/routing.asciidoc +++ b/routing.asciidoc @@ -129,7 +129,7 @@ We call this hash of the payment's secret the payment hash. The secret which "unlocks" the payment is called the payment secret. For now, we keep things simple and assume that Dina's secret is simply the text line: `+Dinas secret+`. -In order to "commit" to this secret, she computes the SHA256 hash which when encoded in hex, can be displayed as: `+f23c83babfb0e5f001c5030cf2a06626f8a940af939c1c35bd4526e90f9759f5+`. +In order to "commit" to this secret, she computes the SHA256 hash which when encoded in hex, can be displayed as: `+0575965b3b44be51e8057d551c4016d83cb1fba9ea8d6e986447ba33fe69f6b3+`. footnote:[You can verify this by typing `echo -n "Dinas secret" | sha256sum` to your Linux command line shell.] To facilitate Alice's payment, Dina will create the secret and the payment hash and send the payment hash to Alice. Alice doesn't know the secret but she can rewrite her contract to use the hash of the secret as a proof of payment: From 9852fa859226acb603b01833b1c094638c3f793e Mon Sep 17 00:00:00 2001 From: Frnk Date: Mon, 5 Apr 2021 17:25:17 +0200 Subject: [PATCH 09/10] Typo "the the" --- channel-construction.asciidoc | 2 +- channel-operation.asciidoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/channel-construction.asciidoc b/channel-construction.asciidoc index 5ed1e33..f8165c9 100644 --- a/channel-construction.asciidoc +++ b/channel-construction.asciidoc @@ -55,7 +55,7 @@ While your funds on the Lightning Network are called to be "off-chain" they are One thing about the Lightning Network is however messing with this understanding of ownership. On the Lightning Network there exist several presigned Transactions which allocate some of the bitcoin to you and some to your channel partner. -Without the the ability to sequence transaction and invalidate old ones via the penalty based revocation mechanism (or other techniques) we could not define clear ownership as the funds would be distributed among its two owners according to which ever transaction would first be broadcasted and successfully mined. +Without the ability to sequence transaction and invalidate old ones via the penalty based revocation mechanism (or other techniques) we could not define clear ownership as the funds would be distributed among its two owners according to which ever transaction would first be broadcasted and successfully mined. If the last paragraph of this summary was confusing: No worries! We are getting there now! **** diff --git a/channel-operation.asciidoc b/channel-operation.asciidoc index 4cb5e74..2b018f4 100644 --- a/channel-operation.asciidoc +++ b/channel-operation.asciidoc @@ -129,7 +129,7 @@ The `revoke_and_ack` Lightning message contains three data fields. * [`point`:`next_per_commitment_point`] While it is really simple and straight forward it is very crucial. -Bob shares the the `per_commitment_secret` of the old commitment transaction which serves as the revocation key and would allow Alice in future to penalize Bob if he publishes the old commitment transaction without the HTLC output. +Bob shares the `per_commitment_secret` of the old commitment transaction which serves as the revocation key and would allow Alice in future to penalize Bob if he publishes the old commitment transaction without the HTLC output. As in a future Alice and Bob might want to negotiate additional commitment transactions he already shares back the `next_per_commitment_point` that he will use in his next commitment transaction. Alice checks that the `per_commitment_secret` produces the last `per_commitment_point` and constructs her new commitment transaction with the HTLC output. From c51a1848152d961ed96c4df2327b0aa05a2797e1 Mon Sep 17 00:00:00 2001 From: Frnk Date: Mon, 5 Apr 2021 17:26:32 +0200 Subject: [PATCH 10/10] diverse minor typo --- gossip.asciidoc | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/gossip.asciidoc b/gossip.asciidoc index 11de102..dd4e390 100644 --- a/gossip.asciidoc +++ b/gossip.asciidoc @@ -8,11 +8,11 @@ Thus the sender has to be aware of the Channel Graph. The channel graph is the interconnected set of publicly advertised channels (more on that later), and the nodes that these channels interlink. As channels are backed by a funding transaction that is happening on chain one might falsely believe that Lightning Nodes could just extract the existing channels from the Bitcoin Blockchain. However this only possible to a certain extend. -The Funding transactions are Pay to Whitness Script addresses and the nature of the script will only be revealed once the funding transaction output is spent. +The Funding transactions are Pay to Witness Script addresses and the nature of the script will only be revealed once the funding transaction output is spent. Even if the nature of the script was known we emphasize that not all 2 - of - 2 multisignature scripts correspond to payment channels. -Since not even every Pay to Whitness Script address that we see in the Bitcoin Blockchain corresponds to a payment channel this approach is not helpful. +Since not even every Pay to Witness Script address that we see in the Bitcoin Blockchain corresponds to a payment channel this approach is not helpful. There are actually more reasons why looking at the Bitcoin Blockchain might not be helpful. -For example on the Lightnign Network the Bitcoin keys that are used for signing are rotated by the nodes for every channel and update. +For example on the Lightning Network the Bitcoin keys that are used for signing are rotated by the nodes for every channel and update. Thus even if we could reliably detect funding transactions on the Bitcoin Blockchain we would not know which two nodes on the Lightning Network own that particular channel. Thus we could node create the Channel Graph that would be used to create candidate paths during the payment delivery via onion routing. @@ -20,11 +20,11 @@ The Lightning Network solves the afore mentioned problem by implementing a gossi Gossip protocols are typical for peer 2 peer networks and are being used so that nodes can share information with other nodes without talking to those other nodes directly. For that Lightning Nodes open encrypted peer 2 peer connections to each other and share novel information that they have received from other peers. As soon as a node wants to share some information - for example about a newly created channel - it sends a message to all its peers. -Uppon receiving a message a node decides if the received message was novel and if so it will forward the information to its peers. -In this way if the peer 2 peer network is connected all new information that is necessary for the operation of the network will eventually be propagated to all other peers. +Upon receiving a message a node decides if the received message was novel and if so it will forward the information to its peers. +In this way if the peer 2 peer network is connected all new information that is necessary for the operation of the network will eventually be propagated to all other peers. Obviously if a new peer initially wants to join the network it needs to know some other peers on the Network initially. -Only then the new peer could connect to them in order to learn about the existance of other peers. +Only then the new peer could connect to them in order to learn about the existence of other peers. In this chapter, we'll explore exactly _how_ Lightning nodes discover each other, and also the channel graph itself. When most refer to the _network_ part @@ -43,8 +43,8 @@ It might be usefull to get familiar with the different terminology that we have [options="header"] |=== | | Channel Graph |peer to peer network -| Name | channel | connection -| initiate | open | (re)connect +| Name | channel | connection +| initiate | open | (re)connect | finalize | close| terminate | technology | Bitcoin Blockchain | encrypted TCP/IP connection | lifetime | until funding spent | while peers are online @@ -63,7 +63,7 @@ system is _eventually consistent_). Using one of many initial bootstrapping protocols to find that first peer, after a connection is established, our new peer now needs to _download_ and _validate_ the channel graph. Once the channel graph has been fully validated, our new peer is ready to start opening channels -and sending payments on the network. +and sending payments on the network. After initial bootstrap, a node on the network needs to continue to maintain its view of the channel graph by: processing new channel routing policy @@ -84,7 +84,7 @@ node that wishes to join the network as he sets out on his journey to which cons . discovery a set of bootstrap peers. . download and validate the channel graph. -. begin the process of ongoing maintainance of the channel graph itself. +. begin the process of ongoing maintenance of the channel graph itself. ### P2P Boostrapping @@ -149,7 +149,7 @@ to implement a form of _identity_ hiding for nodes in the network. #### A New Peer's Bootstrapping Workflow Before diving into the specifics of BOLT 10, we'll first outline the high level -flow of a new node that wishes to use BOLT 10 to join the network. +flow of a new node that wishes to use BOLT 10 to join the network. First, a node needs to identify a single, or set of DNS servers that understand BOLT 10 so they can be used for p2p bootstrapping. @@ -162,7 +162,7 @@ purposes. .Table of known lightning dns seed servers [options="header"] |=== -| dns server | Maintainer +| dns server | Maintainer | lseed.bitcoinstats.com | Christian Decker | nodes.lightning.directory | lightning labs (Olaoluwa Osuntokun) | soa.nodes.lightning.directory | lightning labs (Olaoluwa Osuntokun) @@ -185,7 +185,7 @@ resolvers may filter out SRV records all together, or attempt to truncate the response size itself. Using the widely available `dig` command-line tool, we can query the _testnet_ -version of the DNS seed mentioned above with the following command: +version of the DNS seed mentioned above with the following command: ``` $ dig @8.8.8.8 test.nodes.lightning.directory SRV ``` @@ -269,7 +269,7 @@ In the above command, we've queried the server so we can obtain an `IPv4` address for our target node. Now that we have both the raw public key _and_ IP address, we can connect to the node using the `brontide` transport protocol at: `026c64f5a7f24c6f7f0e1d6ec877f23b2f672fb48967c2545f227d70636395eaf3@X.X.X.X`. -Querying for the curent `A` record for a given node can also be used to look up +Querying for the current `A` record for a given node can also be used to look up the _latest_ set of addresses for a given node. Such queries can be used to more quickly (compared to waiting on gossip as we'll cover later) sync the latest addressing information for a node. @@ -322,7 +322,7 @@ standards document: * `n`: The number of records to return. The default value for this field is `25`. -An example query with additional query options looks something like the following: +An example query with additional query options looks something like the following: ``` r0.a2.n10.nodes.lightning.directory ``` @@ -332,7 +332,7 @@ insights: * `r0`: The query targets the Bitcoin realm. * `a2`: The query only wants IPv4 addresses to be returned. - * `n10`: The query requests + * `n10`: The query requests ## Channel Graph: Structure and Attributes @@ -367,7 +367,7 @@ base Bitcoin blockchain means that it's impossible to _fake_ a valid channel graph, which has useful properties when it comes to spam prevention as we'll see later. The channel graph in the Lightning Network is composed of 3 individual components which are described in BOLT 7: - + * `node_announcement`: The vertex in our graph which communicates the public key of a node, as well as how to reach the node over the internet and some additional metadata describing the set of _features_ the node supports. @@ -382,7 +382,7 @@ individual components which are described in BOLT 7: * `channel_update`: A _pair_ of structures that describes the set of _routing policies_ for a given channel. `channel_update`s come in a _pair_ as a channel is a directed edge, so both sides of the channel are able to specify - their own custom routing policy. An example of a policy communicated in a + their own custom routing policy. An example of a policy communicated in a It's important to note that each of components of the channel graph are themselves _authenticated_ allowing a 3rd party to ensure that the owner of a @@ -443,7 +443,7 @@ described in BOLT 1: * `timestamp`: A timestamp which should be interpreted as a unix epoch formatted timestamp. This allows clients to enforce a partial ordering over - the updates to a node's announcement. + the updates to a node's announcement. * `node_id`: The `secp256k1` public key that this node announcement belongs to. There can only be a single `node_announcement` for a given node in the @@ -468,7 +468,7 @@ described in BOLT 1: ##### Validation Validating an incoming `node_announcement` is straight forward, the following -assertions should be upheld when examining a node announcement: +assertions should be upheld when examining a node announcement: * If an existing `node_announcement` for that node is already known, then the `timestamp` field of a new incoming `node_announcement` MUST be greater @@ -498,7 +498,7 @@ routing by the public network. Active routing nodes may wish to announce all their channels. However, certain nodes like mobile nodes likely don't have the uptime or desire required to be an active routing node. As a result, these mobile nodes (which typically use light clients to connect to the Bitcoin p2p -network), instead may have purely _unadvertised_ channels. +network), instead may have purely _unadvertised_ channels. ##### Unadvertised Channels & The "True" Channel Graph @@ -556,7 +556,7 @@ Based on the information above, we have 3 piece of information we need to encode in order to uniquely reference a given channel. As we want to very compact representation, we'll attempt to encode the information into a _single_ integer using existing known bit packing techniques. Our integer format of -choice is an unsigned 64-bit integer, which is comprised of 8 logical bytes. +choice is an unsigned 64-bit integer, which is comprised of 8 logical bytes. First, the block height. Using 3 bytes (24-bits) we can encode 16777216 blocks, which is more than double the number of blocks that are attached to the current @@ -567,7 +567,7 @@ enough given that it's only possible to fix tens of thousands of transactions in a block at current block sizes. This leaves 2 bytes left for us to encode the output index of the channel within the transaction. -Our final `scid` format resembles: +Our final `scid` format resembles: ``` block_height (3 bytes) || transaction_index (3 bytes) || output_index (2 byes) ```