From 2598119d2f5950d7d9e35634b62b9adc71c9a696 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Wed, 19 May 2021 15:45:58 +1000 Subject: [PATCH 01/15] Add Franck as author --- _authors/franck.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 _authors/franck.md diff --git a/_authors/franck.md b/_authors/franck.md new file mode 100644 index 0000000..8c7e637 --- /dev/null +++ b/_authors/franck.md @@ -0,0 +1,6 @@ +--- +short_name: franck +name: Franck Royer +twitter: dantounet +github: d4nte +--- From a8ef6c95d64fa37416215c09500df68eccc172f3 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Fri, 21 May 2021 16:13:28 +1000 Subject: [PATCH 02/15] First draft --- _posts/2021-05-21-js-waku.md | 109 +++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 _posts/2021-05-21-js-waku.md diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md new file mode 100644 index 0000000..ee06721 --- /dev/null +++ b/_posts/2021-05-21-js-waku.md @@ -0,0 +1,109 @@ +2021-05-21-js-waku.md--- +layout: post +name: "" +title: "" +date: 2021-05-21 12:00:00 +0800 +author: franck +published: true +permalink: /2021-05-21-js-waku +categories: research +summary: This post is going to give you an overview of how spam protection can be achieved in Waku Relay through rate-limiting nullifiers. We will cover a summary of spam-protection methods in centralized and p2p systems, and the solution overview and details of the economic spam-protection method. The open issues and future steps are discussed in the end. +image: /assets/img/rain.png +discuss: https://forum.vac.dev/t/privacy-preserving-p2p-economic-spam-protection-in-waku-v2-with-rate-limiting-nullfiers/66 +--- + +After almost three months working on js-waku, +we thought it would be a good time to give a proper update. + + + +Waku v2 comes from a need to have a more scalable, better optimised solution for the Status app to achieve decentralised +communications on resource restricted devices (ie, phones). +We see a need of such solution not only for ourselves but also for the broader Ethereum ecosystem. + +If you want to read more about Waku v2 and what it aims to achieve, +go to [What's the Plan for Waku v2?](/waku-v2-plan). + + + +Since last year, we have been busy defining and implementing Waku v2 protocols in [nim-waku](https://github.com/status-im/nim-waku), +from which you can build [wakunode2](https://github.com/status-im/nim-waku#wakunode). +Wakunode2 is an adaptive and modular Waku v2 node, +it allows users to run their own node and use the Waku v2 protocols they need. +The nim-waku project doubles as a library, that can be used to add Waku v2 support to native applications. + + + +We believe that dApps and wallets can benefit from the Waku network in several ways. +For some dApp, it may make sense to enable user to user communications. +For others, machine-to-machine communication could be a great asset. +For example, in the case of a DAO with a governance token, +Waku could be used for [gas-less polling](https://twitter.com/ethstatus/status/1293963402705018881?s=20). +Enabling the DAO to notify their users of a new poll, and users to vote without interacting with the blockchain. + + + +For this to happen, we need to give developers a library which is easy integrate in their dApps: +[JS-Waku](https://github.com/status-im/js-waku). + + + +JS-Waku is a JavaScript library that allows your dApp, wallet or other web app to interact with the Waku v2 network. +It is available right now on [npm](https://www.npmjs.com/package/js-waku), start using it by running `npm install js-waku`. + +As it is written in TypeScript, types are included in the npm package to allow easy integration in TypeScript, ClojureScript and other typed languages that compile to JavaScript. + +Key Waku v2 protocols are already available: [message](https://rfc.vac.dev/spec/14/), [store](https://rfc.vac.dev/spec/13/), [relay](https://rfc.vac.dev/spec/11/) and [light push](https://rfc.vac.dev/spec/19/). +Enabling your dApp to: + +- Send and receive near-instant messages on the Waku network (relay), +- Query nodes for messages that may have been missed, e.g. due to poor cellular network (store), +- Send messages with confirmations (light push). + +We focused the past month on developing a [ReactJS Chat App](https://status-im.github.io/js-waku/). +The aim was to create enough building blocks in JS-Waku to enable this showcase web app. +Most of the focus was on getting familiar with both the Waku v2 [RFCs](https://rfc.vac.dev/) +and the [js-libp2p](https://github.com/libp2p/js-libp2p) library that we heavily rely on. + +Soon, we will [use it daily for dogfooding](https://github.com/status-im/nim-waku/issues/399) purposes. + +JS-Waku is the second implementation of Waku v2 so a lot of effort on interoperability was needed. +For example, to ensure compatibility with the reference implementation (nim-waku), +we run our [tests against wakunode2](https://github.com/status-im/js-waku/blob/90c90dea11dfd1277f530cf5d683fb92992fe141/src/lib/waku_relay/index.spec.ts#L137) as part of the CI. + +As we built the [web chat app](https://github.com/status-im/js-waku/tree/main/examples/web-chat), +we were able to fine tune the API to provide a simple and succinct interface. +You can start a node, connect to other nodes and send a message in less than ten lines of code: + +```javascript +import { Waku } from 'js-waku'; + +const waku = await Waku.create(); + +const nodes = await getStatusFleetNodes(); +await Promise.all(nodes.map((addr) => waku.dial(addr))); + +const msg = WakuMessage.fromUtf8String("Here is a message!", "my-cool-app") +await waku.relay.send(msg); +``` + +As more developers use JS-Waku, we will evolve the API to allow for more custom and fine-tune usage of the network +while preserving this out of the box experience. + + + +Next, we are directing our attention towards [Developer Experience](https://github.com/status-im/js-waku/issues/68). +We already have [documentation ready](https://www.npmjs.com/package/js-waku) but we want to provide more: +[Tutorials](https://github.com/status-im/js-waku/issues/56), more examples and showing how [JS-Waku can be used with Web3](https://github.com/status-im/js-waku/issues/72). + + + +If you are as excited as us by JS-Waku, you can start building a dapp with it, you can find documentation on the [npmjs page](https://www.npmjs.com/package/js-waku). + +Whether you are a developer you can still come chat with us on Discord [#waku (core development)](https://discord.gg/uWbdCmFU) or [#waku-support (dev support)](https://discord.gg/VChNsDdj) (soon to be migrated to Waku!). +If you have any ideas on how Waku could enable a specific dapp or use case, do share, we are always keen to hear it. + + + + + From cb627f0d5dd2f7a37259687f276ff3fe84e1c727 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Mon, 24 May 2021 12:28:57 +1000 Subject: [PATCH 03/15] Revisit --- _posts/2021-05-21-js-waku.md | 40 +++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md index ee06721..caeb1b3 100644 --- a/_posts/2021-05-21-js-waku.md +++ b/_posts/2021-05-21-js-waku.md @@ -12,14 +12,18 @@ image: /assets/img/rain.png discuss: https://forum.vac.dev/t/privacy-preserving-p2p-economic-spam-protection-in-waku-v2-with-rate-limiting-nullfiers/66 --- -After almost three months working on js-waku, +After almost three months working on JS-Waku, we thought it would be a good time to give a proper update. +First, let's review what is Waku v2. + Waku v2 comes from a need to have a more scalable, better optimised solution for the Status app to achieve decentralised communications on resource restricted devices (ie, phones). -We see a need of such solution not only for ourselves but also for the broader Ethereum ecosystem. +We see the need of such solution in the broader Ethereum ecosystem, beyond Status. +We are building Waku v2 as a decentralised communication platform for all to use and build onto. +For example, this is one of the reasons why all Waku related code and specs are opensource. If you want to read more about Waku v2 and what it aims to achieve, go to [What's the Plan for Waku v2?](/waku-v2-plan). @@ -35,8 +39,8 @@ The nim-waku project doubles as a library, that can be used to add Waku v2 suppo We believe that dApps and wallets can benefit from the Waku network in several ways. -For some dApp, it may make sense to enable user to user communications. -For others, machine-to-machine communication could be a great asset. +For some dApps, it may make sense to enable user to user communications. +For others, machine-to-machine communications could be a great asset. For example, in the case of a DAO with a governance token, Waku could be used for [gas-less polling](https://twitter.com/ethstatus/status/1293963402705018881?s=20). Enabling the DAO to notify their users of a new poll, and users to vote without interacting with the blockchain. @@ -49,12 +53,13 @@ For this to happen, we need to give developers a library which is easy integrate JS-Waku is a JavaScript library that allows your dApp, wallet or other web app to interact with the Waku v2 network. -It is available right now on [npm](https://www.npmjs.com/package/js-waku), start using it by running `npm install js-waku`. +It is available right now on [npm](https://www.npmjs.com/package/js-waku): `npm install js-waku`. -As it is written in TypeScript, types are included in the npm package to allow easy integration in TypeScript, ClojureScript and other typed languages that compile to JavaScript. +As it is written in TypeScript, types are included in the npm package to allow easy integration with TypeScript, ClojureScript and other typed languages that compile to JavaScript. -Key Waku v2 protocols are already available: [message](https://rfc.vac.dev/spec/14/), [store](https://rfc.vac.dev/spec/13/), [relay](https://rfc.vac.dev/spec/11/) and [light push](https://rfc.vac.dev/spec/19/). -Enabling your dApp to: +Key Waku v2 protocols are already available: +[message](https://rfc.vac.dev/spec/14/), [store](https://rfc.vac.dev/spec/13/), [relay](https://rfc.vac.dev/spec/11/) and [light push](https://rfc.vac.dev/spec/19/), +enabling your dApp to: - Send and receive near-instant messages on the Waku network (relay), - Query nodes for messages that may have been missed, e.g. due to poor cellular network (store), @@ -64,11 +69,11 @@ We focused the past month on developing a [ReactJS Chat App](https://status-im.g The aim was to create enough building blocks in JS-Waku to enable this showcase web app. Most of the focus was on getting familiar with both the Waku v2 [RFCs](https://rfc.vac.dev/) and the [js-libp2p](https://github.com/libp2p/js-libp2p) library that we heavily rely on. - Soon, we will [use it daily for dogfooding](https://github.com/status-im/nim-waku/issues/399) purposes. -JS-Waku is the second implementation of Waku v2 so a lot of effort on interoperability was needed. -For example, to ensure compatibility with the reference implementation (nim-waku), +JS-Waku is the second implementation of Waku v2 protocol, +so a lot of effort on interoperability was needed. +For example, to ensure compatibility with the nim-waku reference implementation, we run our [tests against wakunode2](https://github.com/status-im/js-waku/blob/90c90dea11dfd1277f530cf5d683fb92992fe141/src/lib/waku_relay/index.spec.ts#L137) as part of the CI. As we built the [web chat app](https://github.com/status-im/js-waku/tree/main/examples/web-chat), @@ -93,17 +98,20 @@ while preserving this out of the box experience. Next, we are directing our attention towards [Developer Experience](https://github.com/status-im/js-waku/issues/68). -We already have [documentation ready](https://www.npmjs.com/package/js-waku) but we want to provide more: -[Tutorials](https://github.com/status-im/js-waku/issues/56), more examples and showing how [JS-Waku can be used with Web3](https://github.com/status-im/js-waku/issues/72). +We already have [documentation](https://www.npmjs.com/package/js-waku) available but we want to provide more: +[Tutorials](https://github.com/status-im/js-waku/issues/56), various examples and showing how [JS-Waku can be used with Web3](https://github.com/status-im/js-waku/issues/72). -If you are as excited as us by JS-Waku, you can start building a dapp with it, you can find documentation on the [npmjs page](https://www.npmjs.com/package/js-waku). +If you are as excited as us by JS-Waku, why not building a dApp with it? +You can find documentation on the [npmjs page](https://www.npmjs.com/package/js-waku). -Whether you are a developer you can still come chat with us on Discord [#waku (core development)](https://discord.gg/uWbdCmFU) or [#waku-support (dev support)](https://discord.gg/VChNsDdj) (soon to be migrated to Waku!). +Even better, you can simply join us in building JS-Waku as we are currently have a position open: +[js-waku: Wallet & Dapp Integration Developer](https://status.im/our_team/jobs.html?gh_jid=3157894). + +Whether you are a developer, you can still come chat with us on Discord [#waku (core development)](https://discord.gg/uWbdCmFU) or [#waku-support (dev support)](https://discord.gg/VChNsDdj) (soon to be migrated to Waku!). If you have any ideas on how Waku could enable a specific dapp or use case, do share, we are always keen to hear it. - From 3bf411b259187f0b671b2ecceccf01ee6dfae87a Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Mon, 24 May 2021 12:36:03 +1000 Subject: [PATCH 04/15] Add title --- _posts/2021-05-21-js-waku.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md index caeb1b3..c62571d 100644 --- a/_posts/2021-05-21-js-waku.md +++ b/_posts/2021-05-21-js-waku.md @@ -1,7 +1,7 @@ 2021-05-21-js-waku.md--- layout: post -name: "" -title: "" +name: "Presenting JS-Waku" +title: "Presenting JS-Waku" date: 2021-05-21 12:00:00 +0800 author: franck published: true @@ -102,6 +102,8 @@ We already have [documentation](https://www.npmjs.com/package/js-waku) available [Tutorials](https://github.com/status-im/js-waku/issues/56), various examples and showing how [JS-Waku can be used with Web3](https://github.com/status-im/js-waku/issues/72). + + If you are as excited as us by JS-Waku, why not building a dApp with it? You can find documentation on the [npmjs page](https://www.npmjs.com/package/js-waku). @@ -112,6 +114,4 @@ Even better, you can simply join us in building JS-Waku as we are currently have Whether you are a developer, you can still come chat with us on Discord [#waku (core development)](https://discord.gg/uWbdCmFU) or [#waku-support (dev support)](https://discord.gg/VChNsDdj) (soon to be migrated to Waku!). If you have any ideas on how Waku could enable a specific dapp or use case, do share, we are always keen to hear it. - - From ccdb9318f036b46588f6d592d405a5cf52186eb5 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Mon, 24 May 2021 12:45:20 +1000 Subject: [PATCH 05/15] Fix metadata --- _posts/2021-05-21-js-waku.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md index c62571d..00660f2 100644 --- a/_posts/2021-05-21-js-waku.md +++ b/_posts/2021-05-21-js-waku.md @@ -6,10 +6,9 @@ date: 2021-05-21 12:00:00 +0800 author: franck published: true permalink: /2021-05-21-js-waku -categories: research -summary: This post is going to give you an overview of how spam protection can be achieved in Waku Relay through rate-limiting nullifiers. We will cover a summary of spam-protection methods in centralized and p2p systems, and the solution overview and details of the economic spam-protection method. The open issues and future steps are discussed in the end. -image: /assets/img/rain.png -discuss: https://forum.vac.dev/t/privacy-preserving-p2p-economic-spam-protection-in-waku-v2-with-rate-limiting-nullfiers/66 +categories: platform +summary: "Presenting JS-Waku" +discuss: --- After almost three months working on JS-Waku, From c7bd88137520ad8fa56c790b5c961adaabd9197f Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Mon, 24 May 2021 12:56:28 +1000 Subject: [PATCH 06/15] Few changes --- _posts/2021-05-21-js-waku.md | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md index 00660f2..8471825 100644 --- a/_posts/2021-05-21-js-waku.md +++ b/_posts/2021-05-21-js-waku.md @@ -12,7 +12,7 @@ discuss: --- After almost three months working on JS-Waku, -we thought it would be a good time to give a proper update. +we thought it would be a good time to give it a proper introduction. @@ -21,11 +21,9 @@ First, let's review what is Waku v2. Waku v2 comes from a need to have a more scalable, better optimised solution for the Status app to achieve decentralised communications on resource restricted devices (ie, phones). We see the need of such solution in the broader Ethereum ecosystem, beyond Status. -We are building Waku v2 as a decentralised communication platform for all to use and build onto. -For example, this is one of the reasons why all Waku related code and specs are opensource. - +This is why are building Waku v2 as a decentralised communication platform for all to use and build on. If you want to read more about Waku v2 and what it aims to achieve, -go to [What's the Plan for Waku v2?](/waku-v2-plan). +checkout [What's the Plan for Waku v2?](/waku-v2-plan). @@ -38,7 +36,7 @@ The nim-waku project doubles as a library, that can be used to add Waku v2 suppo We believe that dApps and wallets can benefit from the Waku network in several ways. -For some dApps, it may make sense to enable user to user communications. +For some dApps, it may make sense to enable peer-to-peer communications. For others, machine-to-machine communications could be a great asset. For example, in the case of a DAO with a governance token, Waku could be used for [gas-less polling](https://twitter.com/ethstatus/status/1293963402705018881?s=20). @@ -82,7 +80,7 @@ You can start a node, connect to other nodes and send a message in less than ten ```javascript import { Waku } from 'js-waku'; -const waku = await Waku.create(); +const waku = await Waku.create({}); const nodes = await getStatusFleetNodes(); await Promise.all(nodes.map((addr) => waku.dial(addr))); @@ -110,7 +108,7 @@ You can find documentation on the [npmjs page](https://www.npmjs.com/package/js- Even better, you can simply join us in building JS-Waku as we are currently have a position open: [js-waku: Wallet & Dapp Integration Developer](https://status.im/our_team/jobs.html?gh_jid=3157894). -Whether you are a developer, you can still come chat with us on Discord [#waku (core development)](https://discord.gg/uWbdCmFU) or [#waku-support (dev support)](https://discord.gg/VChNsDdj) (soon to be migrated to Waku!). +Whether you are a developer, you can come chat with us on Discord [#waku (core development)](https://discord.gg/uWbdCmFU) or [#waku-support (dev support)](https://discord.gg/VChNsDdj) (soon to be migrated to Waku!). If you have any ideas on how Waku could enable a specific dapp or use case, do share, we are always keen to hear it. From 2bab4f616a2949471ff5d50081794173e248f330 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Tue, 1 Jun 2021 12:34:12 +1000 Subject: [PATCH 07/15] Feedback + section titles --- _posts/2021-05-21-js-waku.md | 119 ++++++++++++++++++++++++++--------- 1 file changed, 88 insertions(+), 31 deletions(-) diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md index 8471825..d7c2b6c 100644 --- a/_posts/2021-05-21-js-waku.md +++ b/_posts/2021-05-21-js-waku.md @@ -1,53 +1,68 @@ 2021-05-21-js-waku.md--- layout: post -name: "Presenting JS-Waku" -title: "Presenting JS-Waku" +name: "Presenting JS-Waku: Waku v2 in the browser" +title: "Presenting JS-Waku: Waku v2 in the browser" date: 2021-05-21 12:00:00 +0800 author: franck published: true permalink: /2021-05-21-js-waku categories: platform -summary: "Presenting JS-Waku" +summary: "We are summarizing the Waku v2 status, introducing JS-Waku, what we achieved so far and what is next." discuss: --- After almost three months working on JS-Waku, we thought it would be a good time to give it a proper introduction. - +## Waku v2 First, let's review what is Waku v2. Waku v2 comes from a need to have a more scalable, better optimised solution for the Status app to achieve decentralised communications on resource restricted devices (ie, phones). + +The Status chat feature was initially built over Whisper. +However, Whisper has a number of caveats which makes it inefficient for mobile phones. +For example, with Whisper, all devices are receiving all messages which is not ideal for limited data plans. + +To remediate this, a Waku mode (then Waku v1), based on devp2p, was introduced. +To further enable web and restricted resource devices, Waku v2 has been created based on libp2p. +The migration of the Status chat feature to Waku v2 is currently in progress. + We see the need of such solution in the broader Ethereum ecosystem, beyond Status. This is why are building Waku v2 as a decentralised communication platform for all to use and build on. If you want to read more about Waku v2 and what it aims to achieve, checkout [What's the Plan for Waku v2?](/waku-v2-plan). - - Since last year, we have been busy defining and implementing Waku v2 protocols in [nim-waku](https://github.com/status-im/nim-waku), from which you can build [wakunode2](https://github.com/status-im/nim-waku#wakunode). Wakunode2 is an adaptive and modular Waku v2 node, it allows users to run their own node and use the Waku v2 protocols they need. The nim-waku project doubles as a library, that can be used to add Waku v2 support to native applications. - +## Waku v2 in the browser We believe that dApps and wallets can benefit from the Waku network in several ways. -For some dApps, it may make sense to enable peer-to-peer communications. -For others, machine-to-machine communications could be a great asset. -For example, in the case of a DAO with a governance token, -Waku could be used for [gas-less polling](https://twitter.com/ethstatus/status/1293963402705018881?s=20). -Enabling the DAO to notify their users of a new poll, and users to vote without interacting with the blockchain. +For some dApps, it makes sense to enable peer-to-peer communications. +For others, machine-to-machine communications would be a great asset. +For example, in the case of a DAO, +Waku could be used for gas-less voting. +Enabling the DAO to notify their users of a new vote, +and users to vote without interacting with the blockchain and spending gas. - +[Murmur](https://github.com/status-im/murmur) was the first attempt to bring Waku to the browser, +acting as a bridge between Whisper and Waku. +Then, a web chat [POC](https://github.com/vacp2p/waku-web-chat) was created to demonstrate the potential of Waku v2 +in web environment. +It showed how using js-libp2p with few modifications enabled access to the Waku v2 network. +There was still some unresolved challenges. +For example, nim-waku only support TCP connections which are not supported by browser applications. +Hence, to connect to other node, the POC was connecting to a NodeJS proxy application using websockets, +which in turn could connect to wakunode2 via TCP. -For this to happen, we need to give developers a library which is easy integrate in their dApps: -[JS-Waku](https://github.com/status-im/js-waku). - - +However, to enable dApp and Wallet developers to easily integrate Waku in their product, +we need to give them a library that is easy to use and works out of the box: +introducing [JS-Waku](https://github.com/status-im/js-waku). JS-Waku is a JavaScript library that allows your dApp, wallet or other web app to interact with the Waku v2 network. It is available right now on [npm](https://www.npmjs.com/package/js-waku): `npm install js-waku`. @@ -62,17 +77,36 @@ enabling your dApp to: - Query nodes for messages that may have been missed, e.g. due to poor cellular network (store), - Send messages with confirmations (light push). -We focused the past month on developing a [ReactJS Chat App](https://status-im.github.io/js-waku/). -The aim was to create enough building blocks in JS-Waku to enable this showcase web app. -Most of the focus was on getting familiar with both the Waku v2 [RFCs](https://rfc.vac.dev/) -and the [js-libp2p](https://github.com/libp2p/js-libp2p) library that we heavily rely on. -Soon, we will [use it daily for dogfooding](https://github.com/status-im/nim-waku/issues/399) purposes. +JS-Waku needs to operate in the same context from which Waku v2 was born: +a restricted environment were connectivity or uptime are not guaranteed; +JS-Waku bring Waku v2 to the browser. +## Achievements so far + +We focused the past month on developing a [ReactJS Chat App](https://status-im.github.io/js-waku/). +The aim was to create enough building blocks in JS-Waku to enable this showcase web app that +we now [use for dogfooding](https://github.com/status-im/nim-waku/issues/399) purposes. + +Most of the effort was on getting familiar with the [js-libp2p](https://github.com/libp2p/js-libp2p) library +that we heavily rely on. JS-Waku is the second implementation of Waku v2 protocol, so a lot of effort on interoperability was needed. For example, to ensure compatibility with the nim-waku reference implementation, we run our [tests against wakunode2](https://github.com/status-im/js-waku/blob/90c90dea11dfd1277f530cf5d683fb92992fe141/src/lib/waku_relay/index.spec.ts#L137) as part of the CI. +This interoperability effort helped solidify the current Waku v2 specifications: +By clarifying the usage of topics +([#327](https://github.com/vacp2p/rfc/issues/327), [#383](https://github.com/vacp2p/rfc/pull/383)), +fix discrepancies between specs and nim-waku +([#418](https://github.com/status-im/nim-waku/issues/418), [#419](https://github.com/status-im/nim-waku/issues/419)) +and fix small nim-waku & nim-libp2p bugs +([#411](https://github.com/status-im/nim-waku/issues/411), [#439](https://github.com/status-im/nim-waku/issues/439)). + +To fully access the waku network, JS-Waku needs to enable web apps to connect to nim-waku nodes. +A standard way to do so is using secure websockets as it is not possible to connect directly to a TCP port from the browser. +Unfortunately websocket support is not yet available in [nim-libp2p](https://github.com/status-im/nim-libp2p/issues/407) so +we ended up deploying [websockify](https://github.com/novnc/websockify) alongside wakunode2 instances. + As we built the [web chat app](https://github.com/status-im/js-waku/tree/main/examples/web-chat), we were able to fine tune the API to provide a simple and succinct interface. You can start a node, connect to other nodes and send a message in less than ten lines of code: @@ -89,26 +123,49 @@ const msg = WakuMessage.fromUtf8String("Here is a message!", "my-cool-app") await waku.relay.send(msg); ``` +We have also put a bounty at [0xHack](https://0xhack.dev/) for using JS-Waku. +We were thrilled to have a couple of hackers create new software using our libraries. +One of the project aimed to create a decentralised, end-to-end encrypted messenger app, +similar to what the [ETH-DM](https://rfc.vac.dev/spec/20/) protocol aims to achieve. +Another project was a decentralised Twitter platform. +Such projects allow us to prioritize the work on JS-Waku and understand how DevEx can be improved. + As more developers use JS-Waku, we will evolve the API to allow for more custom and fine-tune usage of the network while preserving this out of the box experience. - +## What's next? Next, we are directing our attention towards [Developer Experience](https://github.com/status-im/js-waku/issues/68). We already have [documentation](https://www.npmjs.com/package/js-waku) available but we want to provide more: -[Tutorials](https://github.com/status-im/js-waku/issues/56), various examples and showing how [JS-Waku can be used with Web3](https://github.com/status-im/js-waku/issues/72). +[Tutorials](https://github.com/status-im/js-waku/issues/56), various examples +and showing how [JS-Waku can be used with Web3](https://github.com/status-im/js-waku/issues/72). - - - +By prioritizing DevEx we aim to enable JS-Waku integration in dApps and wallets. +We think JS-Waku builds a strong case for machine-to-machine (M2M) communications. +The first use cases we are looking into are dApp notifications: +Enabling dApp to notify their user directly in their wallets! +Leveraging Waku as a decentralised infrastructure and standard so that users do not have to open their dApp to be notified +of events such as DAO voting. + +We already have some POC in the pipeline to enable voting and polling on the Waku network, +allowing users to save gas by **not** broadcasting each individual vote on the blockchain. + +To facilitate said applications, we are looking at improving integration with Web3 providers by providing examples +of signing, validating, encrypting and decrypting messages using Web3. +Waku is privacy conscious, so we will also provide signature and encryption examples decoupled from users' Ethereum identity. + +As you can read, we have grand plans for JS-Waku and Waku v2. +There is a lot to do, and we would love some help so feel free to +check out the new role in our team: +[js-waku: Wallet & Dapp Integration Developer](https://status.im/our_team/jobs.html?gh_jid=3157894). +We also have a number of [positions](https://status.im/our_team/jobs.html) open to work on Waku protocol and nim-waku. If you are as excited as us by JS-Waku, why not building a dApp with it? You can find documentation on the [npmjs page](https://www.npmjs.com/package/js-waku). -Even better, you can simply join us in building JS-Waku as we are currently have a position open: -[js-waku: Wallet & Dapp Integration Developer](https://status.im/our_team/jobs.html?gh_jid=3157894). - -Whether you are a developer, you can come chat with us on Discord [#waku (core development)](https://discord.gg/uWbdCmFU) or [#waku-support (dev support)](https://discord.gg/VChNsDdj) (soon to be migrated to Waku!). +Whether you are a developer, you can come chat with us using [WakuJS Web Chat](https://status-im.github.io/js-waku/) +or [chat2](https://github.com/status-im/nim-waku/blob/master/docs/tutorial/chat2.md). +You can get support on Discord [#waku-support (dev support)](https://discord.gg/VChNsDdj). If you have any ideas on how Waku could enable a specific dapp or use case, do share, we are always keen to hear it. From 04a89d5222c51fb69b49d677f80dd401f2de2cef Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Wed, 2 Jun 2021 14:01:53 +1000 Subject: [PATCH 08/15] More feedback --- _posts/2021-05-21-js-waku.md | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md index d7c2b6c..e898b3f 100644 --- a/_posts/2021-05-21-js-waku.md +++ b/_posts/2021-05-21-js-waku.md @@ -1,14 +1,15 @@ -2021-05-21-js-waku.md--- +--- layout: post -name: "Presenting JS-Waku: Waku v2 in the browser" -title: "Presenting JS-Waku: Waku v2 in the browser" -date: 2021-05-21 12:00:00 +0800 +name: "Presenting JS-Waku: Waku v2 in the Browser" +title: "Presenting JS-Waku: Waku v2 in the Browser" +date: 2021-06-04 12:00:00 +0800 author: franck published: true -permalink: /2021-05-21-js-waku +permalink: /presenting-js-waku categories: platform -summary: "We are summarizing the Waku v2 status, introducing JS-Waku, what we achieved so far and what is next." -discuss: +summary: "JS-Waku is bringing Waku v2 to the browser. Learn what we achieved so far and what is next in our pipeline!" +image: /assets/img/todo +discuss: TODO --- After almost three months working on JS-Waku, @@ -16,17 +17,17 @@ we thought it would be a good time to give it a proper introduction. ## Waku v2 -First, let's review what is Waku v2. +First, let's review what Waku v2 is and what problem it is trying to solve. Waku v2 comes from a need to have a more scalable, better optimised solution for the Status app to achieve decentralised -communications on resource restricted devices (ie, phones). +communications on resource restricted devices (i.e., mobile phones). The Status chat feature was initially built over Whisper. However, Whisper has a number of caveats which makes it inefficient for mobile phones. For example, with Whisper, all devices are receiving all messages which is not ideal for limited data plans. To remediate this, a Waku mode (then Waku v1), based on devp2p, was introduced. -To further enable web and restricted resource devices, Waku v2 has been created based on libp2p. +To further enable web and restricted resource environments, Waku v2 was created based on libp2p. The migration of the Status chat feature to Waku v2 is currently in progress. We see the need of such solution in the broader Ethereum ecosystem, beyond Status. @@ -50,9 +51,10 @@ Waku could be used for gas-less voting. Enabling the DAO to notify their users of a new vote, and users to vote without interacting with the blockchain and spending gas. -[Murmur](https://github.com/status-im/murmur) was the first attempt to bring Waku to the browser, -acting as a bridge between Whisper and Waku. -Then, a web chat [POC](https://github.com/vacp2p/waku-web-chat) was created to demonstrate the potential of Waku v2 +[Murmur](https://github.com/status-im/murmur) was the first attempt to bring Whisper to the browser, +acting as a bridge between devp2p and libp2p. +Once Waku v2 was started and there was a native implementation on top of libp2p, +a [chat POC](https://github.com/vacp2p/waku-web-chat) was created to demonstrate the potential of Waku v2 in web environment. It showed how using js-libp2p with few modifications enabled access to the Waku v2 network. There was still some unresolved challenges. @@ -65,7 +67,9 @@ we need to give them a library that is easy to use and works out of the box: introducing [JS-Waku](https://github.com/status-im/js-waku). JS-Waku is a JavaScript library that allows your dApp, wallet or other web app to interact with the Waku v2 network. -It is available right now on [npm](https://www.npmjs.com/package/js-waku): `npm install js-waku`. +It is available right now on [npm](https://www.npmjs.com/package/js-waku): + +`npm install js-waku`. As it is written in TypeScript, types are included in the npm package to allow easy integration with TypeScript, ClojureScript and other typed languages that compile to JavaScript. @@ -167,5 +171,3 @@ Whether you are a developer, you can come chat with us using [WakuJS Web Chat](h or [chat2](https://github.com/status-im/nim-waku/blob/master/docs/tutorial/chat2.md). You can get support on Discord [#waku-support (dev support)](https://discord.gg/VChNsDdj). If you have any ideas on how Waku could enable a specific dapp or use case, do share, we are always keen to hear it. - - From 0d018dc8fc966f1868817a7d3f68dd091f5c9994 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Wed, 2 Jun 2021 14:07:45 +1000 Subject: [PATCH 09/15] Update content topic as per guidelines --- _posts/2021-05-21-js-waku.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md index e898b3f..4f75c1c 100644 --- a/_posts/2021-05-21-js-waku.md +++ b/_posts/2021-05-21-js-waku.md @@ -123,7 +123,7 @@ const waku = await Waku.create({}); const nodes = await getStatusFleetNodes(); await Promise.all(nodes.map((addr) => waku.dial(addr))); -const msg = WakuMessage.fromUtf8String("Here is a message!", "my-cool-app") +const msg = WakuMessage.fromUtf8String("Here is a message!", "/my-cool-app/1/my-use-case/proto") await waku.relay.send(msg); ``` From 33f479d4f245cd58cc44bc1ef476ebaf4bbae08f Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Wed, 2 Jun 2021 14:08:56 +1000 Subject: [PATCH 10/15] Add image --- _posts/2021-05-21-js-waku.md | 2 +- assets/img/js-waku-gist.png | Bin 0 -> 36268 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 assets/img/js-waku-gist.png diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-05-21-js-waku.md index 4f75c1c..573a735 100644 --- a/_posts/2021-05-21-js-waku.md +++ b/_posts/2021-05-21-js-waku.md @@ -8,7 +8,7 @@ published: true permalink: /presenting-js-waku categories: platform summary: "JS-Waku is bringing Waku v2 to the browser. Learn what we achieved so far and what is next in our pipeline!" -image: /assets/img/todo +image: /assets/img/js-waku-gist.png discuss: TODO --- diff --git a/assets/img/js-waku-gist.png b/assets/img/js-waku-gist.png new file mode 100644 index 0000000000000000000000000000000000000000..f17dd66b07efbaeddb33c7b83e76cbe62ef21333 GIT binary patch literal 36268 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 K&t;ucLK6VPj>L@s literal 0 HcmV?d00001 From 040286d9e3a0a5ab7fe0cf575a2d7e43a20e8d95 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Wed, 2 Jun 2021 14:33:23 +1000 Subject: [PATCH 11/15] rename with new date --- .../{2021-05-21-js-waku.md => 2021-06-04-presenting-js-waku.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename _posts/{2021-05-21-js-waku.md => 2021-06-04-presenting-js-waku.md} (100%) diff --git a/_posts/2021-05-21-js-waku.md b/_posts/2021-06-04-presenting-js-waku.md similarity index 100% rename from _posts/2021-05-21-js-waku.md rename to _posts/2021-06-04-presenting-js-waku.md From 4f68e0efc2edf910011614f951bbe0a6fa55fb4d Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Wed, 2 Jun 2021 16:28:26 +1000 Subject: [PATCH 12/15] Add discuss link --- _posts/2021-06-04-presenting-js-waku.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_posts/2021-06-04-presenting-js-waku.md b/_posts/2021-06-04-presenting-js-waku.md index 573a735..00d0aed 100644 --- a/_posts/2021-06-04-presenting-js-waku.md +++ b/_posts/2021-06-04-presenting-js-waku.md @@ -9,7 +9,7 @@ permalink: /presenting-js-waku categories: platform summary: "JS-Waku is bringing Waku v2 to the browser. Learn what we achieved so far and what is next in our pipeline!" image: /assets/img/js-waku-gist.png -discuss: TODO +discuss: https://forum.vac.dev/t/discussion-presenting-js-waku-waku-v2-in-the-browser/81 --- After almost three months working on JS-Waku, From 76b92b8a5c0f5c5b38947b292aa4c7c727708f02 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Wed, 2 Jun 2021 16:34:57 +1000 Subject: [PATCH 13/15] Attempt to improve introduction --- README.md | 2 +- _posts/2021-06-04-presenting-js-waku.md | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c4a456c..5120cf4 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,4 @@ 2. Install Jekyll and [bundler gems](https://jekyllrb.com/docs/ruby-101/#bundler). 3. Change into your cloned repo 4. Build the site and make it available on a local server: `bundle exec jekyll serve` -5. Now browse to http://localhost:4000 \ No newline at end of file +5. Now browse to http://localhost:4000 diff --git a/_posts/2021-06-04-presenting-js-waku.md b/_posts/2021-06-04-presenting-js-waku.md index 00d0aed..f56f3f9 100644 --- a/_posts/2021-06-04-presenting-js-waku.md +++ b/_posts/2021-06-04-presenting-js-waku.md @@ -12,8 +12,9 @@ image: /assets/img/js-waku-gist.png discuss: https://forum.vac.dev/t/discussion-presenting-js-waku-waku-v2-in-the-browser/81 --- -After almost three months working on JS-Waku, -we thought it would be a good time to give it a proper introduction. +For the past 3 months, we have been working in bringing Waku v2 to the browser. +Our aim is to empower dApps with Waku v2, and it led to the creation of a new library. +We believe now is good time to introduce it! ## Waku v2 From ab329b3ed1f5d97eb7613b724979cc625aee1880 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Fri, 4 Jun 2021 10:20:53 +1000 Subject: [PATCH 14/15] Grammar --- _posts/2021-06-04-presenting-js-waku.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/_posts/2021-06-04-presenting-js-waku.md b/_posts/2021-06-04-presenting-js-waku.md index f56f3f9..1e0a717 100644 --- a/_posts/2021-06-04-presenting-js-waku.md +++ b/_posts/2021-06-04-presenting-js-waku.md @@ -12,7 +12,7 @@ image: /assets/img/js-waku-gist.png discuss: https://forum.vac.dev/t/discussion-presenting-js-waku-waku-v2-in-the-browser/81 --- -For the past 3 months, we have been working in bringing Waku v2 to the browser. +For the past 3 months, we have been working on bringing Waku v2 to the browser. Our aim is to empower dApps with Waku v2, and it led to the creation of a new library. We believe now is good time to introduce it! @@ -32,7 +32,7 @@ To further enable web and restricted resource environments, Waku v2 was created The migration of the Status chat feature to Waku v2 is currently in progress. We see the need of such solution in the broader Ethereum ecosystem, beyond Status. -This is why are building Waku v2 as a decentralised communication platform for all to use and build on. +This is why we are building Waku v2 as a decentralised communication platform for all to use and build on. If you want to read more about Waku v2 and what it aims to achieve, checkout [What's the Plan for Waku v2?](/waku-v2-plan). @@ -84,7 +84,7 @@ enabling your dApp to: JS-Waku needs to operate in the same context from which Waku v2 was born: a restricted environment were connectivity or uptime are not guaranteed; -JS-Waku bring Waku v2 to the browser. +JS-Waku brings Waku v2 to the browser. ## Achievements so far @@ -130,7 +130,7 @@ await waku.relay.send(msg); We have also put a bounty at [0xHack](https://0xhack.dev/) for using JS-Waku. We were thrilled to have a couple of hackers create new software using our libraries. -One of the project aimed to create a decentralised, end-to-end encrypted messenger app, +One of the projects aimed to create a decentralised, end-to-end encrypted messenger app, similar to what the [ETH-DM](https://rfc.vac.dev/spec/20/) protocol aims to achieve. Another project was a decentralised Twitter platform. Such projects allow us to prioritize the work on JS-Waku and understand how DevEx can be improved. @@ -165,7 +165,7 @@ check out the new role in our team: [js-waku: Wallet & Dapp Integration Developer](https://status.im/our_team/jobs.html?gh_jid=3157894). We also have a number of [positions](https://status.im/our_team/jobs.html) open to work on Waku protocol and nim-waku. -If you are as excited as us by JS-Waku, why not building a dApp with it? +If you are as excited as us by JS-Waku, why not build a dApp with it? You can find documentation on the [npmjs page](https://www.npmjs.com/package/js-waku). Whether you are a developer, you can come chat with us using [WakuJS Web Chat](https://status-im.github.io/js-waku/) From 69b96c09a271e2000b4771e512c7705c8c34b8e5 Mon Sep 17 00:00:00 2001 From: Franck Royer Date: Fri, 4 Jun 2021 10:22:15 +1000 Subject: [PATCH 15/15] Add workshop link --- _posts/2021-06-04-presenting-js-waku.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/_posts/2021-06-04-presenting-js-waku.md b/_posts/2021-06-04-presenting-js-waku.md index 1e0a717..cc70a6e 100644 --- a/_posts/2021-06-04-presenting-js-waku.md +++ b/_posts/2021-06-04-presenting-js-waku.md @@ -128,7 +128,8 @@ const msg = WakuMessage.fromUtf8String("Here is a message!", "/my-cool-app/1/my- await waku.relay.send(msg); ``` -We have also put a bounty at [0xHack](https://0xhack.dev/) for using JS-Waku. +We have also put a bounty at [0xHack](https://0xhack.dev/) for using JS-Waku +and running a [workshop](https://vimeo.com/551509621). We were thrilled to have a couple of hackers create new software using our libraries. One of the projects aimed to create a decentralised, end-to-end encrypted messenger app, similar to what the [ETH-DM](https://rfc.vac.dev/spec/20/) protocol aims to achieve.