Update documentation

This commit is contained in:
status-im-auto 2025-10-03 11:14:33 +00:00
parent 4d65bbdf02
commit 8f3d32169e
230 changed files with 591 additions and 713 deletions

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 87 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[4283],{39018:(e,o,t)=>{var s=t(98941);t.o(s,"AccordionItem")&&t.d(o,{AccordionItem:function(){return s.AccordionItem}})},92384:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>d,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"learn/faq","title":"Waku FAQ","description":"Check out the Getting Started guide to explore our numerous SDKs and learn how to run a Waku node.","source":"@site/docs/learn/faq.md","sourceDirName":"learn","slug":"/learn/faq","permalink":"/learn/faq","draft":false,"unlisted":false,"editUrl":"https://github.com/waku-org/docs.waku.org/tree/develop/docs/learn/faq.md","tags":[],"version":"current","lastUpdatedAt":null,"frontMatter":{"title":"Waku FAQ","hide_table_of_contents":true,"sidebar_label":"Frequently Asked Questions","displayed_sidebar":"learn"},"sidebar":"learn","previous":{"title":"Glossary","permalink":"/learn/glossary"}}');var n=t(74848),r=t(28453),a=t(39018);const i={title:"Waku FAQ",hide_table_of_contents:!0,sidebar_label:"Frequently Asked Questions",displayed_sidebar:"learn"},l=void 0,d={},c=[];function u(e){const o={p:"p",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(a.AccordionItem,{title:"How can I start building my application using Waku?",children:(0,n.jsxs)(o.p,{children:["Check out the ",(0,n.jsx)("a",{href:"/",children:"Getting Started"})," guide to explore our numerous SDKs and learn how to run a Waku node."]})}),"\n",(0,n.jsx)(a.AccordionItem,{title:"Does messaging on Waku require a gas fee?",children:(0,n.jsx)(o.p,{children:"No, sending and receiving messages on Waku involves no gas fee."})}),"\n",(0,n.jsx)(a.AccordionItem,{title:"What encryption does Waku use?",children:(0,n.jsx)(o.p,{children:"Waku uses libp2p noise encryption for node-to-node connections. However, no default encryption method is applied to the data sent over the network. This design choice enhances Waku's encryption flexibility, encouraging developers to use custom protocols or Waku message payload encryption methods freely."})}),"\n",(0,n.jsx)(a.AccordionItem,{title:"Where does Waku store the messages?",children:(0,n.jsxs)(o.p,{children:["Waku's ",(0,n.jsx)("a",{href:"/learn/concepts/protocols#store",children:"Store protocol"})," is designed to temporarily store messages within the network. However, Waku does not guarantee the message's availability and recommends using ",(0,n.jsx)("a",{href:"https://codex.storage/",children:"Codex"})," for long-term storage."]})}),"\n",(0,n.jsx)(a.AccordionItem,{title:"Can Waku only be used for wallet-to-wallet messaging?",children:(0,n.jsx)(o.p,{children:"No, Waku is flexible and imposes no specific rules on identifiers."})}),"\n",(0,n.jsx)(a.AccordionItem,{title:"How does Waku differ from IPFS?",children:(0,n.jsx)(o.p,{children:"Waku focuses on short, ephemeral, real-time messages, while IPFS focuses on large, long-term data storage. Although there's an overlap between the two technologies, Waku does not currently support large data for privacy reasons."})}),"\n",(0,n.jsx)(a.AccordionItem,{title:"What are Rate Limiting Nullifiers (RLN)?",children:(0,n.jsxs)(o.p,{children:[(0,n.jsx)("a",{href:"/learn/concepts/protocols#rln-relay",children:"Rate Limiting Nullifier"})," is a zero-knowledge (ZK) protocol enabling spam protection in a decentralized network while preserving privacy. Each message must be accompanied by a ZK proof, which ",(0,n.jsx)("a",{href:"/learn/concepts/protocols#relay",children:"Relay"})," nodes verify to ensure the publishers do not send more messages than they are allowed. The ZK proof does not leak any private information about message publishers - it only proves they are members of a set of users allowed to publish a certain number of messages per given time frame."]})}),"\n",(0,n.jsx)(a.AccordionItem,{title:"How to start a Waku node?",children:(0,n.jsxs)(o.p,{children:["Follow the README instructions at ",(0,n.jsx)("a",{href:"https://docs.waku.org/guides/nwaku/run-node",children:"nwaku-compose"}),"."]})})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[4283],{39018:(e,o,t)=>{var n=t(98941);t.o(n,"AccordionItem")&&t.d(o,{AccordionItem:function(){return n.AccordionItem}})},92384:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>i,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"learn/faq","title":"Waku FAQ","description":"Check out the Getting Started guide to explore our numerous SDKs and learn how to run a Waku node.","source":"@site/docs/learn/faq.md","sourceDirName":"learn","slug":"/learn/faq","permalink":"/learn/faq","draft":false,"unlisted":false,"editUrl":"https://github.com/waku-org/docs.waku.org/tree/develop/docs/learn/faq.md","tags":[],"version":"current","lastUpdatedAt":null,"frontMatter":{"title":"Waku FAQ","hide_table_of_contents":true,"sidebar_label":"Frequently Asked Questions"},"sidebar":"learn","previous":{"title":"Glossary","permalink":"/learn/glossary"}}');var s=t(74848),r=t(28453),a=t(39018);const i={title:"Waku FAQ",hide_table_of_contents:!0,sidebar_label:"Frequently Asked Questions"},l=void 0,c={},d=[];function u(e){const o={p:"p",...(0,r.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(a.AccordionItem,{title:"How can I start building my application using Waku?",children:(0,s.jsxs)(o.p,{children:["Check out the ",(0,s.jsx)("a",{href:"/",children:"Getting Started"})," guide to explore our numerous SDKs and learn how to run a Waku node."]})}),"\n",(0,s.jsx)(a.AccordionItem,{title:"Does messaging on Waku require a gas fee?",children:(0,s.jsx)(o.p,{children:"No, sending and receiving messages on Waku involves no gas fee."})}),"\n",(0,s.jsx)(a.AccordionItem,{title:"What encryption does Waku use?",children:(0,s.jsx)(o.p,{children:"Waku uses libp2p noise encryption for node-to-node connections. However, no default encryption method is applied to the data sent over the network. This design choice enhances Waku's encryption flexibility, encouraging developers to use custom protocols or Waku message payload encryption methods freely."})}),"\n",(0,s.jsx)(a.AccordionItem,{title:"Where does Waku store the messages?",children:(0,s.jsxs)(o.p,{children:["Waku's ",(0,s.jsx)("a",{href:"/learn/concepts/protocols#store",children:"Store protocol"})," is designed to temporarily store messages within the network. However, Waku does not guarantee the message's availability and recommends using ",(0,s.jsx)("a",{href:"https://codex.storage/",children:"Codex"})," for long-term storage."]})}),"\n",(0,s.jsx)(a.AccordionItem,{title:"Can Waku only be used for wallet-to-wallet messaging?",children:(0,s.jsx)(o.p,{children:"No, Waku is flexible and imposes no specific rules on identifiers."})}),"\n",(0,s.jsx)(a.AccordionItem,{title:"How does Waku differ from IPFS?",children:(0,s.jsx)(o.p,{children:"Waku focuses on short, ephemeral, real-time messages, while IPFS focuses on large, long-term data storage. Although there's an overlap between the two technologies, Waku does not currently support large data for privacy reasons."})}),"\n",(0,s.jsx)(a.AccordionItem,{title:"What are Rate Limiting Nullifiers (RLN)?",children:(0,s.jsxs)(o.p,{children:[(0,s.jsx)("a",{href:"/learn/concepts/protocols#rln-relay",children:"Rate Limiting Nullifier"})," is a zero-knowledge (ZK) protocol enabling spam protection in a decentralized network while preserving privacy. Each message must be accompanied by a ZK proof, which ",(0,s.jsx)("a",{href:"/learn/concepts/protocols#relay",children:"Relay"})," nodes verify to ensure the publishers do not send more messages than they are allowed. The ZK proof does not leak any private information about message publishers - it only proves they are members of a set of users allowed to publish a certain number of messages per given time frame."]})}),"\n",(0,s.jsx)(a.AccordionItem,{title:"How to start a Waku node?",children:(0,s.jsxs)(o.p,{children:["Follow the README instructions at ",(0,s.jsx)("a",{href:"https://docs.waku.org/guides/nwaku/run-node",children:"nwaku-compose"}),"."]})})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,s.jsx)(o,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
/*! @license DOMPurify 3.2.7 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.7/LICENSE */

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
/*! @license DOMPurify 3.2.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.6/LICENSE */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[2076],{22076:(e,r,s)=>{s.d(r,{diagram:()=>t});var a=s(98379),u=(s(24651),s(44540),s(98833),s(45020),s(51789),s(30070),s(66906),s(28823),s(55683),s(68506),s(46792),s(41750)),t={parser:a._$,get db(){return new a.NM},renderer:a.Lh,styles:a.tM,init:(0,u.K2)(e=>{e.class||(e.class={}),e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")}}}]);

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[2159],{42159:(e,r,t)=>{t.d(r,{diagram:()=>u});var a=t(88583),s=(t(44540),t(98833),t(45020),t(51789),t(30070),t(66906),t(28823),t(55683),t(68506),t(46792),t(41750)),u={parser:a.Zk,get db(){return new a.u4(2)},renderer:a.q7,styles:a.tM,init:(0,s.K2)(e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[310],{20310:(e,r,s)=>{s.d(r,{diagram:()=>t});var a=s(98379),u=(s(24651),s(44540),s(98833),s(45020),s(51789),s(30070),s(66906),s(28823),s(55683),s(68506),s(46792),s(41750)),t={parser:a._$,get db(){return new a.NM},renderer:a.Lh,styles:a.tM,init:(0,u.K2)(e=>{e.class||(e.class={}),e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")}}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[3488],{93488:(e,a,r)=>{r.d(a,{diagram:()=>p});var t=r(42467),n=r(73590),s=r(67633),i=r(40797),d=r(78731),o={parse:(0,i.K2)(async e=>{const a=await(0,d.qg)("info",e);i.Rm.debug(a)},"parse")},g={version:t.n.version+""},p={parser:o,db:{getVersion:(0,i.K2)(()=>g.version,"getVersion")},renderer:{draw:(0,i.K2)((e,a,r)=>{i.Rm.debug("rendering info diagram\n"+e);const t=(0,n.D)(a);(0,s.a$)(t,100,400,!0);t.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw")}}}}]);

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[375],{50487:(t,e,a)=>{function r(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}a.d(e,{S:()=>r}),(0,a(41750).K2)(r,"populateCommonDb")},60375:(t,e,a)=>{a.d(e,{diagram:()=>x});var r=a(50487),n=a(46792),o=a(74505),i=a(41750),l=a(78731),s={packet:[]},c=structuredClone(s),d=i.UI.packet,b=(0,i.K2)(()=>{const t=(0,n.$t)({...d,...(0,i.zj)().packet});return t.showBits&&(t.paddingY+=10),t},"getConfig"),k=(0,i.K2)(()=>c.packet,"getPacket"),p={pushWord:(0,i.K2)(t=>{t.length>0&&c.packet.push(t)},"pushWord"),getPacket:k,getConfig:b,clear:(0,i.K2)(()=>{(0,i.IU)(),c=structuredClone(s)},"clear"),setAccTitle:i.SV,getAccTitle:i.iN,setDiagramTitle:i.ke,getDiagramTitle:i.ab,getAccDescription:i.m7,setAccDescription:i.EI},h=(0,i.K2)(t=>{(0,r.S)(t,p);let e=-1,a=[],n=1;const{bitsPerRow:o}=p.getConfig();for(let{start:r,end:l,bits:s,label:c}of t.blocks){if(void 0!==r&&void 0!==l&&l<r)throw new Error(`Packet block ${r} - ${l} is invalid. End must be greater than start.`);if(r??=e+1,r!==e+1)throw new Error(`Packet block ${r} - ${l??r} is not contiguous. It should start from ${e+1}.`);if(0===s)throw new Error(`Packet block ${r} is invalid. Cannot have a zero bit field.`);for(l??=r+(s??1)-1,s??=l-r+1,e=l,i.Rm.debug(`Packet block ${r} - ${e} with label ${c}`);a.length<=o+1&&p.getPacket().length<1e4;){const[t,e]=g({start:r,end:l,bits:s,label:c},n,o);if(a.push(t),t.end+1===n*o&&(p.pushWord(a),a=[],n++),!e)break;({start:r,end:l,bits:s,label:c}=e)}}p.pushWord(a)},"populate"),g=(0,i.K2)((t,e,a)=>{if(void 0===t.start)throw new Error("start should have been set during first phase");if(void 0===t.end)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*a)return[t,void 0];const r=e*a-1,n=e*a;return[{start:t.start,end:r,label:t.label,bits:r-t.start},{start:n,end:t.end,label:t.label,bits:t.end-n}]},"getNextFittingBlock"),u={parse:(0,i.K2)(async t=>{const e=await(0,l.qg)("packet",t);i.Rm.debug(e),h(e)},"parse")},f=(0,i.K2)((t,e,a,r)=>{const n=r.db,l=n.getConfig(),{rowHeight:s,paddingY:c,bitWidth:d,bitsPerRow:b}=l,k=n.getPacket(),p=n.getDiagramTitle(),h=s+c,g=h*(k.length+1)-(p?0:s),u=d*b+2,f=(0,o.D)(e);f.attr("viewbox",`0 0 ${u} ${g}`),(0,i.a$)(f,g,u,l.useMaxWidth);for(const[o,i]of k.entries())w(f,i,o,l);f.append("text").text(p).attr("x",u/2).attr("y",g-h/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),w=(0,i.K2)((t,e,a,{rowHeight:r,paddingX:n,paddingY:o,bitWidth:i,bitsPerRow:l,showBits:s})=>{const c=t.append("g"),d=a*(r+o)+o;for(const b of e){const t=b.start%l*i+1,e=(b.end-b.start+1)*i-n;if(c.append("rect").attr("x",t).attr("y",d).attr("width",e).attr("height",r).attr("class","packetBlock"),c.append("text").attr("x",t+e/2).attr("y",d+r/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(b.label),!s)continue;const a=b.end===b.start,o=d-2;c.append("text").attr("x",t+(a?e/2:0)).attr("y",o).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",a?"middle":"start").text(b.start),a||c.append("text").attr("x",t+e).attr("y",o).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(b.end)}},"drawWord"),$={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},x={parser:u,db:p,renderer:{draw:f},styles:(0,i.K2)(({packet:t}={})=>{const e=(0,n.$t)($,t);return`\n\t.packetByte {\n\t\tfont-size: ${e.byteFontSize};\n\t}\n\t.packetByte.start {\n\t\tfill: ${e.startByteColor};\n\t}\n\t.packetByte.end {\n\t\tfill: ${e.endByteColor};\n\t}\n\t.packetLabel {\n\t\tfill: ${e.labelColor};\n\t\tfont-size: ${e.labelFontSize};\n\t}\n\t.packetTitle {\n\t\tfill: ${e.titleColor};\n\t\tfont-size: ${e.titleFontSize};\n\t}\n\t.packetBlock {\n\t\tstroke: ${e.blockStrokeColor};\n\t\tstroke-width: ${e.blockStrokeWidth};\n\t\tfill: ${e.blockFillColor};\n\t}\n\t`},"styles")}}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[3815],{53815:(e,r,s)=>{s.d(r,{diagram:()=>t});var a=s(71746),u=(s(52501),s(89625),s(21152),s(10045),s(5164),s(28698),s(5894),s(63245),s(32387),s(30092),s(13226),s(67633),s(40797)),t={parser:a._$,get db(){return new a.NM},renderer:a.Lh,styles:a.tM,init:(0,u.K2)(e=>{e.class||(e.class={}),e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[1304],{28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var o=n(96540);const r={},a=o.createContext(r);function s(e){const t=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(a.Provider,{value:t},e.children)}},96573:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"learn/waku-vs-libp2p","title":"Comparing Waku and libp2p","description":"Since Waku is built on top of libp2p, they share a lot of concepts and terminologies between them. However, there are key differences between them that are worth noting.","source":"@site/docs/learn/waku-vs-libp2p.md","sourceDirName":"learn","slug":"/learn/waku-vs-libp2p","permalink":"/learn/waku-vs-libp2p","draft":false,"unlisted":false,"editUrl":"https://github.com/waku-org/docs.waku.org/tree/develop/docs/learn/waku-vs-libp2p.md","tags":[],"version":"current","lastUpdatedAt":null,"frontMatter":{"title":"Comparing Waku and libp2p","hide_table_of_contents":true,"displayed_sidebar":"learn"},"sidebar":"learn","previous":{"title":"RLN Key Benchmarks","permalink":"/learn/research/research-and-studies/rln-key-benchmarks"},"next":{"title":"Glossary","permalink":"/learn/glossary"}}');var r=n(74848),a=n(28453);const s={title:"Comparing Waku and libp2p",hide_table_of_contents:!0,displayed_sidebar:"learn"},i=void 0,l={},c=[{value:"Waku as a service network",id:"waku-as-a-service-network",level:2},{value:"Waku as a turnkey solution",id:"waku-as-a-turnkey-solution",level:2},{value:"Economic spam protection",id:"economic-spam-protection",level:2}];function p(e){const t={a:"a",h2:"h2",p:"p",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"Since Waku is built on top of libp2p, they share a lot of concepts and terminologies between them. However, there are key differences between them that are worth noting."}),"\n",(0,r.jsx)(t.h2,{id:"waku-as-a-service-network",children:"Waku as a service network"}),"\n",(0,r.jsxs)(t.p,{children:["Waku intends to incentivise mechanisms to run nodes, but it is not part of libp2p's scope. Additionally, users or developers do not have to deploy their infrastructure as a prerequisite to use Waku. It is a service network. However, you are encouraged to ",(0,r.jsx)(t.a,{href:"/run-node",children:"run a node"})," to support and decentralise the network."]}),"\n",(0,r.jsx)(t.h2,{id:"waku-as-a-turnkey-solution",children:"Waku as a turnkey solution"}),"\n",(0,r.jsx)(t.p,{children:"Waku includes various protocols covering the following domains: privacy preservation, censorship resistance, and platform agnosticism, allowing it to run on any platform or environment."}),"\n",(0,r.jsxs)(t.p,{children:["Waku provides out-of-the-box protocols to enable mostly offline/resource-limited devices, ",(0,r.jsx)(t.a,{href:"/learn/concepts/protocols#store",children:"Store"}),"/",(0,r.jsx)(t.a,{href:"/learn/concepts/protocols#light-push",children:"Light Push"}),"/",(0,r.jsx)(t.a,{href:"/learn/concepts/protocols#filter",children:"Filter"})," caters to those use cases."]}),"\n",(0,r.jsx)(t.h2,{id:"economic-spam-protection",children:"Economic spam protection"}),"\n",(0,r.jsxs)(t.p,{children:["libp2p does not have strong spam protection guarantees, ",(0,r.jsx)(t.a,{href:"/learn/concepts/protocols#rln-relay",children:"RLN Relay"})," is a protocol being developed by the Waku team towards this goal."]})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[1304],{28453:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>i});var o=n(96540);const r={},a=o.createContext(r);function s(e){const t=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(a.Provider,{value:t},e.children)}},96573:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"learn/waku-vs-libp2p","title":"Comparing Waku and libp2p","description":"Since Waku is built on top of libp2p, they share a lot of concepts and terminologies between them. However, there are key differences between them that are worth noting.","source":"@site/docs/learn/waku-vs-libp2p.md","sourceDirName":"learn","slug":"/learn/waku-vs-libp2p","permalink":"/learn/waku-vs-libp2p","draft":false,"unlisted":false,"editUrl":"https://github.com/waku-org/docs.waku.org/tree/develop/docs/learn/waku-vs-libp2p.md","tags":[],"version":"current","lastUpdatedAt":null,"frontMatter":{"title":"Comparing Waku and libp2p","hide_table_of_contents":true},"sidebar":"learn","previous":{"title":"Research","permalink":"/learn/research"},"next":{"title":"Glossary","permalink":"/learn/glossary"}}');var r=n(74848),a=n(28453);const s={title:"Comparing Waku and libp2p",hide_table_of_contents:!0},i=void 0,l={},c=[{value:"Waku as a service network",id:"waku-as-a-service-network",level:2},{value:"Waku as a turnkey solution",id:"waku-as-a-turnkey-solution",level:2},{value:"Economic spam protection",id:"economic-spam-protection",level:2}];function p(e){const t={a:"a",h2:"h2",p:"p",...(0,a.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(t.p,{children:"Since Waku is built on top of libp2p, they share a lot of concepts and terminologies between them. However, there are key differences between them that are worth noting."}),"\n",(0,r.jsx)(t.h2,{id:"waku-as-a-service-network",children:"Waku as a service network"}),"\n",(0,r.jsxs)(t.p,{children:["Waku intends to incentivise mechanisms to run nodes, but it is not part of libp2p's scope. Additionally, users or developers do not have to deploy their infrastructure as a prerequisite to use Waku. It is a service network. However, you are encouraged to ",(0,r.jsx)(t.a,{href:"/#run-a-waku-node",children:"run a node"})," to support and decentralise the network."]}),"\n",(0,r.jsx)(t.h2,{id:"waku-as-a-turnkey-solution",children:"Waku as a turnkey solution"}),"\n",(0,r.jsx)(t.p,{children:"Waku includes various protocols covering the following domains: privacy preservation, censorship resistance, and platform agnosticism, allowing it to run on any platform or environment."}),"\n",(0,r.jsxs)(t.p,{children:["Waku provides out-of-the-box protocols to enable mostly offline/resource-limited devices, ",(0,r.jsx)(t.a,{href:"/learn/concepts/protocols#store",children:"Store"}),"/",(0,r.jsx)(t.a,{href:"/learn/concepts/protocols#light-push",children:"Light Push"}),"/",(0,r.jsx)(t.a,{href:"/learn/concepts/protocols#filter",children:"Filter"})," caters to those use cases."]}),"\n",(0,r.jsx)(t.h2,{id:"economic-spam-protection",children:"Economic spam protection"}),"\n",(0,r.jsxs)(t.p,{children:["libp2p does not have strong spam protection guarantees, ",(0,r.jsx)(t.a,{href:"/learn/concepts/protocols#rln-relay",children:"RLN Relay"})," is a protocol being developed by the Waku team towards this goal."]})]})}function u(e={}){const{wrapper:t}={...(0,a.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[4802],{84802:(e,r,t)=>{t.d(r,{diagram:()=>u});var a=t(54616),s=(t(89625),t(21152),t(10045),t(5164),t(28698),t(5894),t(63245),t(32387),t(30092),t(13226),t(67633),t(40797)),u={parser:a.Zk,get db(){return new a.u4(2)},renderer:a.q7,styles:a.tM,init:(0,s.K2)(e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")}}}]);

View File

@ -0,0 +1 @@
(()=>{"use strict";var e,r,t={84809:(e,r,t)=>{t.d(r,{BH:()=>a,Ho:()=>s,IH:()=>n,sx:()=>o});t(58291);const o=!1,a=["en"],n="search-index{dir}.json?_=95fea220",s=1}},o={};function a(e){var r=o[e];if(void 0!==r)return r.exports;var n=o[e]={exports:{}};return t[e](n,n.exports,a),n.exports}a.m=t,a.x=()=>{var e=a.O(void 0,[540],()=>a(90540));return e=a.O(e)},e=[],a.O=(r,t,o,n)=>{if(!t){var s=1/0;for(f=0;f<e.length;f++){t=e[f][0],o=e[f][1],n=e[f][2];for(var i=!0,u=0;u<t.length;u++)(!1&n||s>=n)&&Object.keys(a.O).every(e=>a.O[e](t[u]))?t.splice(u--,1):(i=!1,n<s&&(s=n));if(i){e.splice(f--,1);var p=o();void 0!==p&&(r=p)}}return r}n=n||0;for(var f=e.length;f>0&&e[f-1][2]>n;f--)e[f]=e[f-1];e[f]=[t,o,n]},a.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return a.d(r,{a:r}),r},a.d=(e,r)=>{for(var t in r)a.o(r,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce((r,t)=>(a.f[t](e,r),r),[])),a.u=e=>"assets/js/"+e+".59e0d2f8.js",a.miniCssF=e=>{},a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),a.p="/",a.gca=function(e){return e={}[e]||e,a.p+a.u(e)},(()=>{var e={4809:1};a.f.i=(r,t)=>{e[r]||importScripts(a.p+a.u(r))};var r=self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[],t=r.push.bind(r);r.push=r=>{var o=r[0],n=r[1],s=r[2];for(var i in n)a.o(n,i)&&(a.m[i]=n[i]);for(s&&s(a);o.length;)e[o.pop()]=1;t(r)}})(),r=a.x,a.x=()=>a.e(540).then(r);a.x()})();

View File

@ -1 +0,0 @@
(()=>{"use strict";var e,r,t={84809:(e,r,t)=>{t.d(r,{BH:()=>n,Ho:()=>a,IH:()=>s,sx:()=>o});t(58291);const o=!1,n=["en"],s="search-index{dir}.json?_=f3d51dfc",a=1}},o={};function n(e){var r=o[e];if(void 0!==r)return r.exports;var s=o[e]={exports:{}};return t[e](s,s.exports,n),s.exports}n.m=t,n.x=()=>{var e=n.O(void 0,[540],()=>n(90540));return e=n.O(e)},e=[],n.O=(r,t,o,s)=>{if(!t){var a=1/0;for(p=0;p<e.length;p++){t=e[p][0],o=e[p][1],s=e[p][2];for(var i=!0,u=0;u<t.length;u++)(!1&s||a>=s)&&Object.keys(n.O).every(e=>n.O[e](t[u]))?t.splice(u--,1):(i=!1,s<a&&(a=s));if(i){e.splice(p--,1);var f=o();void 0!==f&&(r=f)}}return r}s=s||0;for(var p=e.length;p>0&&e[p-1][2]>s;p--)e[p]=e[p-1];e[p]=[t,o,s]},n.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return n.d(r,{a:r}),r},n.d=(e,r)=>{for(var t in r)n.o(r,t)&&!n.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},n.f={},n.e=e=>Promise.all(Object.keys(n.f).reduce((r,t)=>(n.f[t](e,r),r),[])),n.u=e=>"assets/js/"+e+".59e0d2f8.js",n.miniCssF=e=>{},n.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),n.p="/",n.gca=function(e){return e={}[e]||e,n.p+n.u(e)},(()=>{var e={4809:1};n.f.i=(r,t)=>{e[r]||importScripts(n.p+n.u(r))};var r=self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[],t=r.push.bind(r);r.push=r=>{var o=r[0],s=r[1],a=r[2];for(var i in s)n.o(s,i)&&(n.m[i]=s[i]);for(a&&a(n);o.length;)e[o.pop()]=1;t(r)}})(),r=n.x,n.x=()=>n.e(540).then(r);n.x()})();

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[4866],{50487:(e,t,a)=>{function i(e,t){e.accDescr&&t.setAccDescription?.(e.accDescr),e.accTitle&&t.setAccTitle?.(e.accTitle),e.title&&t.setDiagramTitle?.(e.title)}a.d(t,{S:()=>i}),(0,a(41750).K2)(i,"populateCommonDb")},64866:(e,t,a)=>{a.d(t,{diagram:()=>k});var i=a(50487),n=a(46792),l=a(74505),r=a(41750),s=a(78731),o=a(70451),c=r.UI.pie,p={sections:new Map,showData:!1,config:c},d=p.sections,u=p.showData,g=structuredClone(c),h=(0,r.K2)(()=>structuredClone(g),"getConfig"),m=(0,r.K2)(()=>{d=new Map,u=p.showData,(0,r.IU)()},"clear"),f=(0,r.K2)(({label:e,value:t})=>{d.has(e)||(d.set(e,t),r.Rm.debug(`added new section: ${e}, with value: ${t}`))},"addSection"),S=(0,r.K2)(()=>d,"getSections"),w=(0,r.K2)(e=>{u=e},"setShowData"),x=(0,r.K2)(()=>u,"getShowData"),D={getConfig:h,clear:m,setDiagramTitle:r.ke,getDiagramTitle:r.ab,setAccTitle:r.SV,getAccTitle:r.iN,setAccDescription:r.EI,getAccDescription:r.m7,addSection:f,getSections:S,setShowData:w,getShowData:x},T=(0,r.K2)((e,t)=>{(0,i.S)(e,t),t.setShowData(e.showData),e.sections.map(t.addSection)},"populateDb"),$={parse:(0,r.K2)(async e=>{const t=await(0,s.qg)("pie",e);r.Rm.debug(t),T(t,D)},"parse")},y=(0,r.K2)(e=>`\n .pieCircle{\n stroke: ${e.pieStrokeColor};\n stroke-width : ${e.pieStrokeWidth};\n opacity : ${e.pieOpacity};\n }\n .pieOuterCircle{\n stroke: ${e.pieOuterStrokeColor};\n stroke-width: ${e.pieOuterStrokeWidth};\n fill: none;\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${e.pieTitleTextSize};\n fill: ${e.pieTitleTextColor};\n font-family: ${e.fontFamily};\n }\n .slice {\n font-family: ${e.fontFamily};\n fill: ${e.pieSectionTextColor};\n font-size:${e.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${e.pieLegendTextColor};\n font-family: ${e.fontFamily};\n font-size: ${e.pieLegendTextSize};\n }\n`,"getStyles"),C=(0,r.K2)(e=>{const t=[...e.entries()].map(e=>({label:e[0],value:e[1]})).sort((e,t)=>t.value-e.value);return(0,o.rLf)().value(e=>e.value)(t)},"createPieArcs"),k={parser:$,db:D,renderer:{draw:(0,r.K2)((e,t,a,i)=>{r.Rm.debug("rendering pie chart\n"+e);const s=i.db,c=(0,r.D7)(),p=(0,n.$t)(s.getConfig(),c.pie),d=18,u=450,g=u,h=(0,l.D)(t),m=h.append("g");m.attr("transform","translate(225,225)");const{themeVariables:f}=c;let[S]=(0,n.I5)(f.pieOuterStrokeWidth);S??=2;const w=p.textPosition,x=Math.min(g,u)/2-40,D=(0,o.JLW)().innerRadius(0).outerRadius(x),T=(0,o.JLW)().innerRadius(x*w).outerRadius(x*w);m.append("circle").attr("cx",0).attr("cy",0).attr("r",x+S/2).attr("class","pieOuterCircle");const $=s.getSections(),y=C($),k=[f.pie1,f.pie2,f.pie3,f.pie4,f.pie5,f.pie6,f.pie7,f.pie8,f.pie9,f.pie10,f.pie11,f.pie12],b=(0,o.UMr)(k);m.selectAll("mySlices").data(y).enter().append("path").attr("d",D).attr("fill",e=>b(e.data.label)).attr("class","pieCircle");let K=0;$.forEach(e=>{K+=e}),m.selectAll("mySlices").data(y).enter().append("text").text(e=>(e.data.value/K*100).toFixed(0)+"%").attr("transform",e=>"translate("+T.centroid(e)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(s.getDiagramTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");const v=m.selectAll(".legend").data(b.domain()).enter().append("g").attr("class","legend").attr("transform",(e,t)=>"translate(216,"+(22*t-22*b.domain().length/2)+")");v.append("rect").attr("width",d).attr("height",d).style("fill",b).style("stroke",b),v.data(y).append("text").attr("x",22).attr("y",14).text(e=>{const{label:t,value:a}=e.data;return s.getShowData()?`${t} [${a}]`:t});const A=512+Math.max(...v.selectAll("text").nodes().map(e=>e?.getBoundingClientRect().width??0));h.attr("viewBox",`0 0 ${A} 450`),(0,r.a$)(h,u,A,p.useMaxWidth)},"draw")},styles:y}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[6567],{16567:(t,e,a)=>{a.d(e,{diagram:()=>m});var r=a(73590),i=a(25871),n=a(13226),s=a(67633),o=a(40797),l=a(78731),c=s.UI.packet,d=class{constructor(){this.packet=[],this.setAccTitle=s.SV,this.getAccTitle=s.iN,this.setDiagramTitle=s.ke,this.getDiagramTitle=s.ab,this.getAccDescription=s.m7,this.setAccDescription=s.EI}static{(0,o.K2)(this,"PacketDB")}getConfig(){const t=(0,n.$t)({...c,...(0,s.zj)().packet});return t.showBits&&(t.paddingY+=10),t}getPacket(){return this.packet}pushWord(t){t.length>0&&this.packet.push(t)}clear(){(0,s.IU)(),this.packet=[]}},p=(0,o.K2)((t,e)=>{(0,i.S)(t,e);let a=-1,r=[],n=1;const{bitsPerRow:s}=e.getConfig();for(let{start:i,end:l,bits:c,label:d}of t.blocks){if(void 0!==i&&void 0!==l&&l<i)throw new Error(`Packet block ${i} - ${l} is invalid. End must be greater than start.`);if(i??=a+1,i!==a+1)throw new Error(`Packet block ${i} - ${l??i} is not contiguous. It should start from ${a+1}.`);if(0===c)throw new Error(`Packet block ${i} is invalid. Cannot have a zero bit field.`);for(l??=i+(c??1)-1,c??=l-i+1,a=l,o.Rm.debug(`Packet block ${i} - ${a} with label ${d}`);r.length<=s+1&&e.getPacket().length<1e4;){const[t,a]=b({start:i,end:l,bits:c,label:d},n,s);if(r.push(t),t.end+1===n*s&&(e.pushWord(r),r=[],n++),!a)break;({start:i,end:l,bits:c,label:d}=a)}}e.pushWord(r)},"populate"),b=(0,o.K2)((t,e,a)=>{if(void 0===t.start)throw new Error("start should have been set during first phase");if(void 0===t.end)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*a)return[t,void 0];const r=e*a-1,i=e*a;return[{start:t.start,end:r,label:t.label,bits:r-t.start},{start:i,end:t.end,label:t.label,bits:t.end-i}]},"getNextFittingBlock"),h={parser:{yy:void 0},parse:(0,o.K2)(async t=>{const e=await(0,l.qg)("packet",t),a=h.parser?.yy;if(!(a instanceof d))throw new Error("parser.parser?.yy was not a PacketDB. This is due to a bug within Mermaid, please report this issue at https://github.com/mermaid-js/mermaid/issues.");o.Rm.debug(e),p(e,a)},"parse")},k=(0,o.K2)((t,e,a,i)=>{const n=i.db,o=n.getConfig(),{rowHeight:l,paddingY:c,bitWidth:d,bitsPerRow:p}=o,b=n.getPacket(),h=n.getDiagramTitle(),k=l+c,u=k*(b.length+1)-(h?0:l),f=d*p+2,w=(0,r.D)(e);w.attr("viewbox",`0 0 ${f} ${u}`),(0,s.a$)(w,u,f,o.useMaxWidth);for(const[r,s]of b.entries())g(w,s,r,o);w.append("text").text(h).attr("x",f/2).attr("y",u-k/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),g=(0,o.K2)((t,e,a,{rowHeight:r,paddingX:i,paddingY:n,bitWidth:s,bitsPerRow:o,showBits:l})=>{const c=t.append("g"),d=a*(r+n)+n;for(const p of e){const t=p.start%o*s+1,e=(p.end-p.start+1)*s-i;if(c.append("rect").attr("x",t).attr("y",d).attr("width",e).attr("height",r).attr("class","packetBlock"),c.append("text").attr("x",t+e/2).attr("y",d+r/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(p.label),!l)continue;const a=p.end===p.start,n=d-2;c.append("text").attr("x",t+(a?e/2:0)).attr("y",n).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",a?"middle":"start").text(p.start),a||c.append("text").attr("x",t+e).attr("y",n).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(p.end)}},"drawWord"),u={draw:k},f={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},w=(0,o.K2)(({packet:t}={})=>{const e=(0,n.$t)(f,t);return`\n\t.packetByte {\n\t\tfont-size: ${e.byteFontSize};\n\t}\n\t.packetByte.start {\n\t\tfill: ${e.startByteColor};\n\t}\n\t.packetByte.end {\n\t\tfill: ${e.endByteColor};\n\t}\n\t.packetLabel {\n\t\tfill: ${e.labelColor};\n\t\tfont-size: ${e.labelFontSize};\n\t}\n\t.packetTitle {\n\t\tfill: ${e.titleColor};\n\t\tfont-size: ${e.titleFontSize};\n\t}\n\t.packetBlock {\n\t\tstroke: ${e.blockStrokeColor};\n\t\tstroke-width: ${e.blockStrokeWidth};\n\t\tfill: ${e.blockFillColor};\n\t}\n\t`},"styles"),m={parser:h,get db(){return new d},renderer:u,styles:w}},25871:(t,e,a)=>{function r(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}a.d(e,{S:()=>r}),(0,a(40797).K2)(r,"populateCommonDb")}}]);

View File

@ -0,0 +1 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[4061],{28453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>o});var t=n(96540);const r={},i=t.createContext(r);function c(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),t.createElement(i.Provider,{value:s},e.children)}},53763:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>o,default:()=>d,frontMatter:()=>c,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"learn/concepts/peer-discovery","title":"Peer Discovery","description":"When initialising a Waku node, it must connect with other peers to enable message sending, receiving, and retrieval. To achieve this, a discovery mechanism is employed to locate other peers in the network. This process is known as bootstrapping.","source":"@site/docs/learn/concepts/peer-discovery.md","sourceDirName":"learn/concepts","slug":"/learn/concepts/peer-discovery","permalink":"/learn/concepts/peer-discovery","draft":false,"unlisted":false,"editUrl":"https://github.com/waku-org/docs.waku.org/tree/develop/docs/learn/concepts/peer-discovery.md","tags":[],"version":"current","lastUpdatedAt":null,"frontMatter":{"title":"Peer Discovery","hide_table_of_contents":true,"displayed_sidebar":"learn"},"sidebar":"learn","previous":{"title":"Transports","permalink":"/learn/concepts/transports"},"next":{"title":"Static Peers","permalink":"/learn/concepts/static-peers"}}');var r=n(74848),i=n(28453);const c={title:"Peer Discovery",hide_table_of_contents:!0,displayed_sidebar:"learn"},o=void 0,a={},l=[];function p(e){const s={a:"a",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.p,{children:"When initialising a Waku node, it must connect with other peers to enable message sending, receiving, and retrieval. To achieve this, a discovery mechanism is employed to locate other peers in the network. This process is known as bootstrapping."}),"\n",(0,r.jsx)(s.p,{children:"Once a connection is established, the node must actively seek out additional peers to have:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Sufficient peers in the ",(0,r.jsx)(s.a,{href:"/learn/concepts/protocols#relay",children:"Relay"})," mesh: The goal is to have at least 6 peers in the mesh. This ensures a robust network where messages can be efficiently relayed."]}),"\n",(0,r.jsx)(s.li,{children:"Reserve peers for backup: It is essential to have a surplus of peers available as reserves. These reserves are backups when the current peers become overloaded or experience unexpected disconnections."}),"\n",(0,r.jsxs)(s.li,{children:["Peers with specific capabilities: The node seeks out peers with specific capabilities, such as ",(0,r.jsx)(s.a,{href:"/learn/concepts/protocols#store",children:"Store"}),", ",(0,r.jsx)(s.a,{href:"/learn/concepts/protocols#light-push",children:"Light Push"}),", or ",(0,r.jsx)(s.a,{href:"/learn/concepts/protocols#filter",children:"Filter"}),". This allows for targeted interactions and enhanced functionality based on the desired capabilities."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Waku supports multiple peer discovery mechanisms, such as:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/learn/concepts/static-peers",children:"Configuring Static Peers"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/learn/concepts/dns-discovery",children:"Peer Discovery via DNS"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/learn/concepts/discv5",children:"Discv5 Ambient Peer Discovery"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/learn/concepts/peer-exchange",children:"Peer Exchange"})}),"\n"]})]})}function d(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[4061],{28453:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>o});var t=n(96540);const r={},i=t.createContext(r);function c(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function o(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),t.createElement(i.Provider,{value:s},e.children)}},53763:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>a,contentTitle:()=>o,default:()=>h,frontMatter:()=>c,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"learn/concepts/peer-discovery","title":"Peer Discovery","description":"When initialising a Waku node, it must connect with other peers to enable message sending, receiving, and retrieval. To achieve this, a discovery mechanism is employed to locate other peers in the network. This process is known as bootstrapping.","source":"@site/docs/learn/concepts/peer-discovery.md","sourceDirName":"learn/concepts","slug":"/learn/concepts/peer-discovery","permalink":"/learn/concepts/peer-discovery","draft":false,"unlisted":false,"editUrl":"https://github.com/waku-org/docs.waku.org/tree/develop/docs/learn/concepts/peer-discovery.md","tags":[],"version":"current","lastUpdatedAt":null,"frontMatter":{"title":"Peer Discovery","hide_table_of_contents":true},"sidebar":"learn","previous":{"title":"Transports","permalink":"/learn/concepts/transports"},"next":{"title":"Static Peers","permalink":"/learn/concepts/static-peers"}}');var r=n(74848),i=n(28453);const c={title:"Peer Discovery",hide_table_of_contents:!0},o=void 0,a={},l=[];function p(e){const s={a:"a",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(s.p,{children:"When initialising a Waku node, it must connect with other peers to enable message sending, receiving, and retrieval. To achieve this, a discovery mechanism is employed to locate other peers in the network. This process is known as bootstrapping."}),"\n",(0,r.jsx)(s.p,{children:"Once a connection is established, the node must actively seek out additional peers to have:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsxs)(s.li,{children:["Sufficient peers in the ",(0,r.jsx)(s.a,{href:"/learn/concepts/protocols#relay",children:"Relay"})," mesh: The goal is to have at least 6 peers in the mesh. This ensures a robust network where messages can be efficiently relayed."]}),"\n",(0,r.jsx)(s.li,{children:"Reserve peers for backup: It is essential to have a surplus of peers available as reserves. These reserves are backups when the current peers become overloaded or experience unexpected disconnections."}),"\n",(0,r.jsxs)(s.li,{children:["Peers with specific capabilities: The node seeks out peers with specific capabilities, such as ",(0,r.jsx)(s.a,{href:"/learn/concepts/protocols#store",children:"Store"}),", ",(0,r.jsx)(s.a,{href:"/learn/concepts/protocols#light-push",children:"Light Push"}),", or ",(0,r.jsx)(s.a,{href:"/learn/concepts/protocols#filter",children:"Filter"}),". This allows for targeted interactions and enhanced functionality based on the desired capabilities."]}),"\n"]}),"\n",(0,r.jsx)(s.p,{children:"Waku supports multiple peer discovery mechanisms, such as:"}),"\n",(0,r.jsxs)(s.ul,{children:["\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/learn/concepts/static-peers",children:"Configuring Static Peers"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/learn/concepts/dns-discovery",children:"Peer Discovery via DNS"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/learn/concepts/discv5",children:"Discv5 Ambient Peer Discovery"})}),"\n",(0,r.jsx)(s.li,{children:(0,r.jsx)(s.a,{href:"/learn/concepts/peer-exchange",children:"Peer Exchange"})}),"\n"]})]})}function h(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(p,{...e})}):p(e)}}}]);

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[6795],{16795:(e,a,r)=>{r.d(a,{diagram:()=>g});var t=r(8872),n=r(74505),s=r(41750),i=r(78731),d={parse:(0,s.K2)(async e=>{const a=await(0,i.qg)("info",e);s.Rm.debug(a)},"parse")},o={version:t.n.version+""},g={parser:d,db:{getVersion:(0,s.K2)(()=>o.version,"getVersion")},renderer:{draw:(0,s.K2)((e,a,r)=>{s.Rm.debug("rendering info diagram\n"+e);const t=(0,n.D)(a);(0,s.a$)(t,100,400,!0);t.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${r}`)},"draw")}}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
"use strict";(self.webpackChunkwaku_guide=self.webpackChunkwaku_guide||[]).push([[1903],{28453:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>o});var a=t(96540);const r={},i=a.createContext(r);function s(e){const n=a.useContext(i);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),a.createElement(i.Provider,{value:n},e.children)}},51432:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>h,frontMatter:()=>s,metadata:()=>a,toc:()=>l});const a=JSON.parse('{"id":"learn/research","title":"Research","description":"The following features are currently experimental and under research and initial implementation:","source":"@site/docs/learn/research.md","sourceDirName":"learn","slug":"/learn/research","permalink":"/learn/research","draft":false,"unlisted":false,"editUrl":"https://github.com/waku-org/docs.waku.org/tree/develop/docs/learn/research.md","tags":[],"version":"current","lastUpdatedAt":null,"frontMatter":{"title":"Research","hide_table_of_contents":true},"sidebar":"learn","previous":{"title":"Security Features","permalink":"/learn/security-features"},"next":{"title":"Comparing Waku and libp2p","permalink":"/learn/waku-vs-libp2p"}}');var r=t(74848),i=t(28453);const s={title:"Research",hide_table_of_contents:!0},o=void 0,c={},l=[{value:"Economic spam resistance",id:"economic-spam-resistance",level:2},{value:"Prevention of denial of service (DoS) and node incentivisation",id:"prevention-of-denial-of-service-dos-and-node-incentivisation",level:2}];function d(e){const n={a:"a",code:"code",h2:"h2",p:"p",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"The following features are currently experimental and under research and initial implementation:"}),"\n",(0,r.jsx)(n.h2,{id:"economic-spam-resistance",children:"Economic spam resistance"}),"\n",(0,r.jsxs)(n.p,{children:["We aim to enable an incentivised spam protection technique to enhance ",(0,r.jsx)(n.code,{children:"Relay"})," by using ",(0,r.jsx)(n.a,{href:"https://rfc.vac.dev/vac/32/rln-v1/",children:"Rate Limit Nullifiers (RLN)"}),". In this advanced method, peers are limited to a certain messaging rate per epoch, and an immediate financial penalty is enforced for spammers who break this rate. You can find more details in the ",(0,r.jsx)(n.a,{href:"https://vac.dev/rln-relay",children:"RLN Relay blog post"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["We have prepared a PoC implementation of this method in JS: ",(0,r.jsx)(n.a,{href:"https://examples.waku.org/rln-js/",children:"https://examples.waku.org/rln-js/"})]}),"\n",(0,r.jsx)(n.h2,{id:"prevention-of-denial-of-service-dos-and-node-incentivisation",children:"Prevention of denial of service (DoS) and node incentivisation"}),"\n",(0,r.jsxs)(n.p,{children:["Denial of service signifies the case where an adversarial peer exhausts another node's service capacity (e.g., by making a large number of requests) and makes it unavailable to the rest of the system. RnD on DoS attack mitigation can be tracked from here: ",(0,r.jsx)(n.a,{href:"https://github.com/vacp2p/research/issues/148",children:"https://github.com/vacp2p/research/issues/148"}),"."]}),"\n",(0,r.jsxs)(n.p,{children:["In a nutshell, peers have to pay for the service they obtain from each other. In addition to incentivising the service provider, accounting also makes DoS attacks costly for malicious peers. The accounting model can be used in ",(0,r.jsx)(n.code,{children:"Store"})," and ",(0,r.jsx)(n.code,{children:"Filter"})," to protect against DoS attacks."]}),"\n",(0,r.jsxs)(n.p,{children:["Additionally, along with RLN, this gives node operators who provide a useful service to the network an incentive to perform that service. Read more here: ",(0,r.jsx)(n.a,{href:"https://vac.dev/building-privacy-protecting-infrastructure",children:"https://vac.dev/building-privacy-protecting-infrastructure"})]}),"\n",(0,r.jsxs)(n.p,{children:["You can also read more about the ongoing challenges the Waku team is working on here: ",(0,r.jsx)(n.a,{href:"https://github.com/waku-org/research",children:"https://github.com/waku-org/research"})]})]})}function h(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More