diff --git a/examples/eth-dm/src/App.tsx b/examples/eth-dm/src/App.tsx index 500be91e77..64a985871b 100644 --- a/examples/eth-dm/src/App.tsx +++ b/examples/eth-dm/src/App.tsx @@ -12,9 +12,10 @@ import { PublicKeyMessage, generateEthDmKeyPair, KeyPair, + validatePublicKeyMessage, } from './crypto'; -const ContentTopic = '/eth-dm/1/public-key/json'; +const PublicKeyContentTopic = '/eth-dm/1/public-key/json'; declare let window: any; @@ -22,17 +23,23 @@ function App() { const [waku, setWaku] = useState(); const [provider, setProvider] = useState(); const [ethDmKeyPair, setEthDmKeyPair] = useState(); + const [publicKeyMsg, setPublicKeyMsg] = useState(); useEffect(() => { if (provider) return; - const _provider = new ethers.providers.Web3Provider(window.ethereum); - setProvider(_provider); + try { + const _provider = new ethers.providers.Web3Provider(window.ethereum); + setProvider(_provider); + } catch (e) { + console.error('No web3 provider available'); + } }, [provider]); useEffect(() => { if (waku) return; initWaku() .then((wakuNode) => { + console.log('waku: ready'); setWaku(wakuNode); }) .catch((e) => { @@ -40,7 +47,7 @@ function App() { }); }, [waku]); - useEffect(() => { + const generateKeyPair = () => { if (ethDmKeyPair) return; if (!provider) return; @@ -51,29 +58,45 @@ function App() { .catch((e) => { console.error('Failed to generate Key Pair', e); }); - }, [ethDmKeyPair, provider]); + }; - const onClick = () => { + useEffect(() => { + if (!waku) return; + waku.relay.addObserver(handlePublicKeyMessage, [PublicKeyContentTopic]); + }); + + const broadcastPublicKey = () => { if (!ethDmKeyPair) return; if (!provider) return; if (!waku) return; - createPublicKeyMessage(provider.getSigner(), ethDmKeyPair.publicKey) - .then((msg) => { - const wakuMsg = createWakuMessage(msg); - waku.relay.send(wakuMsg).catch((e) => { - console.error('Failed to send Public Key Message'); - }); - }) - .catch((e) => { - console.error('Failed to creat Eth-Dm Publication message', e); + if (publicKeyMsg) { + const wakuMsg = createWakuMessage(publicKeyMsg); + waku.relay.send(wakuMsg).catch((e) => { + console.error('Failed to send Public Key Message'); }); + } else { + createPublicKeyMessage(provider.getSigner(), ethDmKeyPair.publicKey) + .then((msg) => { + setPublicKeyMsg(msg); + const wakuMsg = createWakuMessage(msg); + waku.relay.send(wakuMsg).catch((e) => { + console.error('Failed to send Public Key Message'); + }); + }) + .catch((e) => { + console.error('Failed to creat Eth-Dm Publication message', e); + }); + } }; return (
- +
@@ -106,6 +129,26 @@ function getNodes() { } function createWakuMessage(ethDmMsg: PublicKeyMessage): WakuMessage { - const payload = Buffer.from(JSON.stringify(ethDmMsg)); - return WakuMessage.fromBytes(payload, ContentTopic); + const payload = encode(ethDmMsg); + return WakuMessage.fromBytes(payload, PublicKeyContentTopic); +} + +function handlePublicKeyMessage(msg: WakuMessage) { + if (msg.payload) { + const publicKeyMsg = decode(msg.payload); + console.log('publicKeyMsg', publicKeyMsg); + const res = validatePublicKeyMessage(publicKeyMsg); + console.log(`Public Key Message Received, valid: ${res}`, publicKeyMsg); + } +} + +function encode(msg: PublicKeyMessage): Buffer { + const jsonStr = JSON.stringify(msg); + return Buffer.from(jsonStr, 'utf-8'); +} + +function decode(bytes: Uint8Array): PublicKeyMessage { + const buf = Buffer.from(bytes); + const str = buf.toString('utf-8'); + return JSON.parse(str); } diff --git a/examples/eth-dm/src/crypto.test.ts b/examples/eth-dm/src/crypto.test.ts index 82528f8a1e..75a146f195 100644 --- a/examples/eth-dm/src/crypto.test.ts +++ b/examples/eth-dm/src/crypto.test.ts @@ -7,7 +7,7 @@ import { ethers } from 'ethers'; import { createPublicKeyMessage, generateEthDmKeyPair, - verifyEthDmPublicKey, + validatePublicKeyMessage, } from './crypto'; import { MockProvider } from 'ethereum-waffle'; import { waffleJest } from '@ethereum-waffle/jest'; @@ -24,7 +24,7 @@ test('Signature of Eth-DM key is verifiable', async () => { const ethDmMsg = await createPublicKeyMessage(wallet, ethDmKeys.publicKey); console.log('Verify EthDm message'); - const res = verifyEthDmPublicKey(ethDmMsg); + const res = validatePublicKeyMessage(ethDmMsg); expect(res).toBe(true); }); diff --git a/examples/eth-dm/src/crypto.ts b/examples/eth-dm/src/crypto.ts index c967bbf0de..f9eb9a55ba 100644 --- a/examples/eth-dm/src/crypto.ts +++ b/examples/eth-dm/src/crypto.ts @@ -56,9 +56,9 @@ export async function createPublicKeyMessage( } /** - * Verifies that the EthDm Public Key was signed by the holder of the given Ethereum address. + * Validate that the EthDm Public Key was signed by the holder of the given Ethereum address. */ -export function verifyEthDmPublicKey(msg: PublicKeyMessage): boolean { +export function validatePublicKeyMessage(msg: PublicKeyMessage): boolean { try { const sigAddress = ethers.utils.verifyMessage( formatPublicKeyForSignature(msg.ethDmPublicKey),