Use StrictSign signature policy in pubsub (#295)

* Log number of connected peers on connect/disconnect

* Log generated peer id if file path not provided

* Use StrictSign signature policy in pubsub
This commit is contained in:
prathamesh0 2023-01-17 13:54:24 +05:30 committed by GitHub
parent 64a30b7a4d
commit 1e5485c6ef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 32 additions and 23 deletions

View File

@ -31,7 +31,7 @@ A basic CLI to pass messages between peers using `stdin`/`stdout`
yarn create-peer --file [PEER_ID_FILE_PATH] yarn create-peer --file [PEER_ID_FILE_PATH]
``` ```
* `file (f)`: file path to export the peer id to (json) * `file (f)`: file path to export the peer id to (json) (default: logs to console)
* (Optional) Run a local relay node: * (Optional) Run a local relay node:

View File

@ -33,7 +33,7 @@ This project was bootstrapped with [Create React App](https://github.com/faceboo
yarn create-peer --file [PEER_ID_FILE_PATH] yarn create-peer --file [PEER_ID_FILE_PATH]
``` ```
* `file (f)`: file path to export the peer id to (json) * `file (f)`: file path to export the peer id to (json) (default: logs to console)
* (Optional) Run a local relay node: * (Optional) Run a local relay node:

View File

@ -38,8 +38,8 @@ function App() {
peer.broadcastMessage(message) peer.broadcastMessage(message)
} }
const unsubscribeTopic = peer.subscribeTopic(TEST_TOPIC, (data) => { const unsubscribeTopic = peer.subscribeTopic(TEST_TOPIC, (peerId, data) => {
console.log(`> ${data}`) console.log(`${peerId.toString()} > ${data}`)
}) })
window.flood = (message: string) => { window.flood = (message: string) => {

View File

@ -3,4 +3,6 @@
// //
export const PUBSUB_DISCOVERY_INTERVAL = 10000; // 10 seconds export const PUBSUB_DISCOVERY_INTERVAL = 10000; // 10 seconds
export const PUBSUB_SIGNATURE_POLICY = 'StrictSign';
export const HOP_TIMEOUT = 24 * 60 * 60 * 1000; // 1 day export const HOP_TIMEOUT = 24 * 60 * 60 * 1000; // 1 day

View File

@ -15,11 +15,6 @@ interface Arguments {
} }
async function main (): Promise<void> { async function main (): Promise<void> {
const argv: Arguments = _getArgv();
const exportFilePath = path.resolve(argv.file);
const exportFileDir = path.dirname(exportFilePath);
const peerId = await createEd25519PeerId(); const peerId = await createEd25519PeerId();
assert(peerId.privateKey); assert(peerId.privateKey);
@ -29,12 +24,20 @@ async function main (): Promise<void> {
pubKey: Buffer.from(peerId.publicKey).toString('base64') pubKey: Buffer.from(peerId.publicKey).toString('base64')
}; };
const argv: Arguments = _getArgv();
if (argv.file) {
const exportFilePath = path.resolve(argv.file);
const exportFileDir = path.dirname(exportFilePath);
if (!fs.existsSync(exportFileDir)) { if (!fs.existsSync(exportFileDir)) {
fs.mkdirSync(exportFileDir, { recursive: true }); fs.mkdirSync(exportFileDir, { recursive: true });
} }
fs.writeFileSync(exportFilePath, JSON.stringify(obj)); fs.writeFileSync(exportFilePath, JSON.stringify(obj, null, 2));
console.log(`Peer id ${peerId.toString()} exported to file ${exportFilePath}`); console.log(`Peer id ${peerId.toString()} exported to file ${exportFilePath}`);
} else {
console.log(obj);
}
} }
function _getArgv (): any { function _getArgv (): any {
@ -44,8 +47,7 @@ function _getArgv (): any {
file: { file: {
type: 'string', type: 'string',
alias: 'f', alias: 'f',
describe: 'Peer Id export file path (json)', describe: 'Peer Id export file path (json)'
demandOption: true
} }
}).argv; }).argv;
} }

View File

@ -24,7 +24,7 @@ import { multiaddr, Multiaddr } from '@multiformats/multiaddr';
import { floodsub } from '@libp2p/floodsub'; import { floodsub } from '@libp2p/floodsub';
import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery'; import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery';
import { PUBSUB_DISCOVERY_INTERVAL } from './constants.js'; import { PUBSUB_DISCOVERY_INTERVAL, PUBSUB_SIGNATURE_POLICY } from './constants.js';
export const CHAT_PROTOCOL = '/chat/1.0.0'; export const CHAT_PROTOCOL = '/chat/1.0.0';
export const DEFAULT_SIGNAL_SERVER_URL = '/ip4/127.0.0.1/tcp/13579/wss/p2p-webrtc-star'; export const DEFAULT_SIGNAL_SERVER_URL = '/ip4/127.0.0.1/tcp/13579/wss/p2p-webrtc-star';
@ -37,7 +37,7 @@ export class Peer {
_remotePeerIds: PeerId[] = [] _remotePeerIds: PeerId[] = []
_peerStreamMap: Map<string, Pushable<any>> = new Map() _peerStreamMap: Map<string, Pushable<any>> = new Map()
_messageHandlers: Array<(peerId: PeerId, message: any) => void> = [] _messageHandlers: Array<(peerId: PeerId, message: any) => void> = []
_topicHandlers: Map<string, Array<(data: any) => void>> = new Map() _topicHandlers: Map<string, Array<(peerId: PeerId, data: any) => void>> = new Map()
constructor (nodejs?: boolean) { constructor (nodejs?: boolean) {
// Instantiation in nodejs. // Instantiation in nodejs.
@ -87,7 +87,7 @@ export class Peer {
], ],
connectionEncryption: [noise()], connectionEncryption: [noise()],
streamMuxers: [mplex()], streamMuxers: [mplex()],
pubsub: floodsub(), pubsub: floodsub({ globalSignaturePolicy: PUBSUB_SIGNATURE_POLICY }),
peerDiscovery, peerDiscovery,
relay: { relay: {
enabled: true, enabled: true,
@ -189,7 +189,7 @@ export class Peer {
return unsubscribe; return unsubscribe;
} }
subscribeTopic (topic: string, handler: (data: any) => void): () => void { subscribeTopic (topic: string, handler: (peerId: PeerId, data: any) => void): () => void {
assert(this._node); assert(this._node);
// Subscribe node to the topic // Subscribe node to the topic
@ -234,6 +234,7 @@ export class Peer {
// Log connected peer // Log connected peer
console.log(`Connected to ${remotePeerId.toString()} using multiaddr ${connection.remoteAddr.toString()}`); console.log(`Connected to ${remotePeerId.toString()} using multiaddr ${connection.remoteAddr.toString()}`);
console.log(`Current number of peers connected: ${this._node?.getPeers().length}`);
} }
_handleDisconnect (connection: Connection): void { _handleDisconnect (connection: Connection): void {
@ -242,6 +243,7 @@ export class Peer {
// Log disconnected peer // Log disconnected peer
console.log(`Disconnected from ${disconnectedPeerId.toString()} using multiaddr ${connection.remoteAddr.toString()}`); console.log(`Disconnected from ${disconnectedPeerId.toString()} using multiaddr ${connection.remoteAddr.toString()}`);
console.log(`Current number of peers connected: ${this._node?.getPeers().length}`);
} }
async _connectPeer (peer: PeerInfo): Promise<void> { async _connectPeer (peer: PeerInfo): Promise<void> {
@ -319,10 +321,13 @@ export class Peer {
} }
_handleMessage (msg: Message): void { _handleMessage (msg: Message): void {
// Messages should be signed since globalSignaturePolicy is set to 'StrictSign'
assert(msg.type === 'signed');
// Send msg data to registered topic handlers // Send msg data to registered topic handlers
this._topicHandlers.get(msg.topic)?.forEach(handler => { this._topicHandlers.get(msg.topic)?.forEach(handler => {
const dataObj = JSON.parse(uint8ArrayToString(msg.data)); const dataObj = JSON.parse(uint8ArrayToString(msg.data));
handler(dataObj); handler(msg.from, dataObj);
}); });
} }
} }

View File

@ -17,7 +17,7 @@ import { pubsubPeerDiscovery } from '@libp2p/pubsub-peer-discovery';
import { createFromJSON } from '@libp2p/peer-id-factory'; import { createFromJSON } from '@libp2p/peer-id-factory';
import { DEFAULT_SIGNAL_SERVER_URL } from './index.js'; import { DEFAULT_SIGNAL_SERVER_URL } from './index.js';
import { HOP_TIMEOUT, PUBSUB_DISCOVERY_INTERVAL } from './constants.js'; import { HOP_TIMEOUT, PUBSUB_DISCOVERY_INTERVAL, PUBSUB_SIGNATURE_POLICY } from './constants.js';
interface Arguments { interface Arguments {
signalServer: string; signalServer: string;
@ -55,7 +55,7 @@ async function main (): Promise<void> {
], ],
connectionEncryption: [noise()], connectionEncryption: [noise()],
streamMuxers: [mplex()], streamMuxers: [mplex()],
pubsub: floodsub(), pubsub: floodsub({ globalSignaturePolicy: PUBSUB_SIGNATURE_POLICY }),
peerDiscovery: [ peerDiscovery: [
pubsubPeerDiscovery({ pubsubPeerDiscovery({
interval: PUBSUB_DISCOVERY_INTERVAL interval: PUBSUB_DISCOVERY_INTERVAL