import { createLibp2p } from 'libp2p' import { generateKeyPairFromSeed } from '@libp2p/crypto/keys' import { webSockets } from '@libp2p/websockets' import { circuitRelayServer, circuitRelayTransport } from '@libp2p/circuit-relay-v2' import { noise } from '@chainsafe/libp2p-noise' import { yamux } from '@chainsafe/libp2p-yamux' import { identify } from '@libp2p/identify' import { createHash } from 'crypto'; const publicMultiaddr = process.env.PUBLIC_MULTIADDR; const seed = process.env.SEED; if (typeof publicMultiaddr !== 'string' || !publicMultiaddr.length) { console.log('no PUBLIC_MULTIADDR or invalid PUBLIC_MULTIADDR specified'); process.exit(1); } if (typeof seed !== 'string' || !seed.length) { console.log('no SEED or invalid SEED specified'); process.exit(1); } const seedHash = createHash('sha512').update(seed).digest('base64'); const key = await generateKeyPairFromSeed('Ed25519', new TextEncoder().encode(seedHash).slice(0, 32)); const relay = await createLibp2p({ privateKey: key, transports: [ webSockets(), circuitRelayTransport(), ], addresses: { listen: [`/ip4/0.0.0.0/tcp/4000/ws`], announce: [publicMultiaddr], }, connectionEncrypters: [noise()], streamMuxers: [yamux()], services: { identify: identify(), relay: circuitRelayServer({ reservations: 1024, reservationTTL: 15 * 60 * 1000, // 15 minutes }), } }) await relay.start() console.log('Relay listening on:') relay.getMultiaddrs().forEach(ma => console.log(ma.toString()))