From 5354c8a874ef4d00809136bbc47e0f9d8fff6563 Mon Sep 17 00:00:00 2001 From: Daniel N <2color@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:21:13 +0100 Subject: [PATCH 1/5] feat: add utility function to parse peer ids --- packages/peer-id/src/index.ts | 19 ++++++++++++++++++- packages/peer-id/test/index.spec.ts | 14 +++++++++++++- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/peer-id/src/index.ts b/packages/peer-id/src/index.ts index b098c9a696..ccf646897f 100644 --- a/packages/peer-id/src/index.ts +++ b/packages/peer-id/src/index.ts @@ -17,7 +17,7 @@ import { publicKeyFromMultihash } from '@libp2p/crypto/keys' import { InvalidCIDError, InvalidMultihashError, InvalidParametersError, UnsupportedKeyTypeError } from '@libp2p/interface' import { base58btc } from 'multiformats/bases/base58' -import { type CID, type MultibaseDecoder } from 'multiformats/cid' +import { CID, type MultibaseDecoder } from 'multiformats/cid' import * as Digest from 'multiformats/hashes/digest' import { identity } from 'multiformats/hashes/identity' import { sha256 } from 'multiformats/hashes/sha2' @@ -125,3 +125,20 @@ function isIdentityMultihash (multihash: MultihashDigest): multihash is Multihas function isSha256Multihash (multihash: MultihashDigest): multihash is MultihashDigest<0x12> { return multihash.code === sha256.code } + + +/** + * Get a PeerId from a string + * + * @param peerIdString - The string to get the PeerId from, can be a base58btc encoded multihash or a CID + * @returns PeerId + */ +export function getPeerId(peerIdString: string): PeerId { + // It's either base58btc encoded multihash (identity or sha256) + if (peerIdString.charAt(0) === '1' || peerIdString.charAt(0) === 'Q') { + return peerIdFromString(peerIdString) + } + + // or base36 encoded CID + return peerIdFromCID(CID.parse(peerIdString)) +} diff --git a/packages/peer-id/test/index.spec.ts b/packages/peer-id/test/index.spec.ts index b94506fbfd..1e2b72d744 100644 --- a/packages/peer-id/test/index.spec.ts +++ b/packages/peer-id/test/index.spec.ts @@ -6,7 +6,7 @@ import { CID } from 'multiformats/cid' import { identity } from 'multiformats/hashes/identity' import Sinon from 'sinon' import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' -import { peerIdFromCID, peerIdFromMultihash, peerIdFromPrivateKey, peerIdFromString } from '../src/index.js' +import { getPeerId, peerIdFromCID, peerIdFromMultihash, peerIdFromPrivateKey, peerIdFromString } from '../src/index.js' import type { KeyType, PeerId } from '@libp2p/interface' // these values are from https://github.com/multiformats/multicodec/blob/master/table.csv @@ -56,6 +56,18 @@ describe('PeerId', () => { expect(id.toCID().toString()).to.equal(peerId.toCID().toString()) }) + it('should create a peer id from a string that can be either a base58btc encoded multihash or a CID', async () => { + let id = getPeerId(peerId.toString()) + expect(id.type).to.equal(type) + expect(id.toString()).to.equal(peerId.toString()) + expect(id.toCID().toString()).to.equal(peerId.toCID().toString()) + + id = getPeerId(peerId.toCID().toString()) + expect(id.type).to.equal(type) + expect(id.toString()).to.equal(peerId.toString()) + expect(id.toCID().toString()).to.equal(peerId.toCID().toString()) + }) + it('should default to base58btc when stringifying', async () => { expect(base58btc.decode(`z${peerId.toString()}`)).to.be.ok() }) From bd559a117cb22b1a361028cc1adf10d92149d30c Mon Sep 17 00:00:00 2001 From: Daniel N <2color@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:23:57 +0100 Subject: [PATCH 2/5] fix: linting error --- packages/peer-id/src/index.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/peer-id/src/index.ts b/packages/peer-id/src/index.ts index ccf646897f..c9b39ad647 100644 --- a/packages/peer-id/src/index.ts +++ b/packages/peer-id/src/index.ts @@ -126,14 +126,13 @@ function isSha256Multihash (multihash: MultihashDigest): multihash is MultihashD return multihash.code === sha256.code } - /** * Get a PeerId from a string * * @param peerIdString - The string to get the PeerId from, can be a base58btc encoded multihash or a CID * @returns PeerId */ -export function getPeerId(peerIdString: string): PeerId { +export function getPeerId (peerIdString: string): PeerId { // It's either base58btc encoded multihash (identity or sha256) if (peerIdString.charAt(0) === '1' || peerIdString.charAt(0) === 'Q') { return peerIdFromString(peerIdString) From 50370b7a6e349328854fd23f4273aec5ba9d84f6 Mon Sep 17 00:00:00 2001 From: Daniel N <2color@users.noreply.github.com> Date: Tue, 11 Mar 2025 17:03:24 +0100 Subject: [PATCH 3/5] fix: use prefix to detect cid encoded peers --- packages/peer-id/src/index.ts | 19 +++---------------- packages/peer-id/test/index.spec.ts | 11 ++++++----- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/packages/peer-id/src/index.ts b/packages/peer-id/src/index.ts index c9b39ad647..15c22a1dad 100644 --- a/packages/peer-id/src/index.ts +++ b/packages/peer-id/src/index.ts @@ -37,6 +37,9 @@ export function peerIdFromString (str: string, decoder?: MultibaseDecoder): // identity hash ed25519/secp256k1 key or sha2-256 hash of // rsa public key - base58btc encoded either way multihash = Digest.decode(base58btc.decode(`z${str}`)) + } else if (str.startsWith('k51qzi5uqu5') || str.startsWith('kzwfwjn5ji4') || str.startsWith('k2k4r8') || str.startsWith('bafz')) { + // base36 encoded CIDv1 with libp2p-key and identity hash (for ed25519/secp256k1/rsa) or base32 encoded CIDv1 with libp2p-key and identity hash (for ed25519/secp256k1/rsa) + return peerIdFromCID(CID.parse(str)) } else { if (decoder == null) { throw new InvalidParametersError('Please pass a multibase decoder for strings that do not start with "1" or "Q"') @@ -125,19 +128,3 @@ function isIdentityMultihash (multihash: MultihashDigest): multihash is Multihas function isSha256Multihash (multihash: MultihashDigest): multihash is MultihashDigest<0x12> { return multihash.code === sha256.code } - -/** - * Get a PeerId from a string - * - * @param peerIdString - The string to get the PeerId from, can be a base58btc encoded multihash or a CID - * @returns PeerId - */ -export function getPeerId (peerIdString: string): PeerId { - // It's either base58btc encoded multihash (identity or sha256) - if (peerIdString.charAt(0) === '1' || peerIdString.charAt(0) === 'Q') { - return peerIdFromString(peerIdString) - } - - // or base36 encoded CID - return peerIdFromCID(CID.parse(peerIdString)) -} diff --git a/packages/peer-id/test/index.spec.ts b/packages/peer-id/test/index.spec.ts index 1e2b72d744..9b31659efb 100644 --- a/packages/peer-id/test/index.spec.ts +++ b/packages/peer-id/test/index.spec.ts @@ -2,11 +2,13 @@ import { generateKeyPair } from '@libp2p/crypto/keys' import { expect } from 'aegir/chai' import { base58btc } from 'multiformats/bases/base58' +import { base36 } from 'multiformats/bases/base36' +import { base32 } from 'multiformats/bases/base32' import { CID } from 'multiformats/cid' import { identity } from 'multiformats/hashes/identity' import Sinon from 'sinon' import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' -import { getPeerId, peerIdFromCID, peerIdFromMultihash, peerIdFromPrivateKey, peerIdFromString } from '../src/index.js' +import { peerIdFromCID, peerIdFromMultihash, peerIdFromPrivateKey, peerIdFromString } from '../src/index.js' import type { KeyType, PeerId } from '@libp2p/interface' // these values are from https://github.com/multiformats/multicodec/blob/master/table.csv @@ -56,13 +58,12 @@ describe('PeerId', () => { expect(id.toCID().toString()).to.equal(peerId.toCID().toString()) }) - it('should create a peer id from a string that can be either a base58btc encoded multihash or a CID', async () => { - let id = getPeerId(peerId.toString()) + it('should return the correct peer id from cid encoded peer id in base36 and base32', async () => { + let id = peerIdFromString(peerId.toCID().toString(base36)) expect(id.type).to.equal(type) expect(id.toString()).to.equal(peerId.toString()) expect(id.toCID().toString()).to.equal(peerId.toCID().toString()) - - id = getPeerId(peerId.toCID().toString()) + id = peerIdFromString(peerId.toCID().toString(base32)) expect(id.type).to.equal(type) expect(id.toString()).to.equal(peerId.toString()) expect(id.toCID().toString()).to.equal(peerId.toCID().toString()) From a77a97f4d7f1f750970c2a8235e1eac8b6cf0323 Mon Sep 17 00:00:00 2001 From: Daniel N <2color@users.noreply.github.com> Date: Wed, 12 Mar 2025 09:13:03 +0100 Subject: [PATCH 4/5] fix: linting errors --- packages/peer-id/test/index.spec.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/peer-id/test/index.spec.ts b/packages/peer-id/test/index.spec.ts index 9b31659efb..3719ec1e6b 100644 --- a/packages/peer-id/test/index.spec.ts +++ b/packages/peer-id/test/index.spec.ts @@ -1,9 +1,9 @@ /* eslint-env mocha */ import { generateKeyPair } from '@libp2p/crypto/keys' import { expect } from 'aegir/chai' -import { base58btc } from 'multiformats/bases/base58' -import { base36 } from 'multiformats/bases/base36' import { base32 } from 'multiformats/bases/base32' +import { base36 } from 'multiformats/bases/base36' +import { base58btc } from 'multiformats/bases/base58' import { CID } from 'multiformats/cid' import { identity } from 'multiformats/hashes/identity' import Sinon from 'sinon' From 4fac4d728f627c5d79ef21abab1d8988ad82bea8 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 12 Mar 2025 11:19:23 +0100 Subject: [PATCH 5/5] chore: split base32/base36 tests --- packages/peer-id/test/index.spec.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/peer-id/test/index.spec.ts b/packages/peer-id/test/index.spec.ts index 3719ec1e6b..343363aba9 100644 --- a/packages/peer-id/test/index.spec.ts +++ b/packages/peer-id/test/index.spec.ts @@ -58,12 +58,15 @@ describe('PeerId', () => { expect(id.toCID().toString()).to.equal(peerId.toCID().toString()) }) - it('should return the correct peer id from cid encoded peer id in base36 and base32', async () => { - let id = peerIdFromString(peerId.toCID().toString(base36)) + it('should return the correct peer id from cid encoded peer id in base36', async () => { + const id = peerIdFromString(peerId.toCID().toString(base36)) expect(id.type).to.equal(type) expect(id.toString()).to.equal(peerId.toString()) expect(id.toCID().toString()).to.equal(peerId.toCID().toString()) - id = peerIdFromString(peerId.toCID().toString(base32)) + }) + + it('should return the correct peer id from cid encoded peer id in base32', async () => { + const id = peerIdFromString(peerId.toCID().toString(base32)) expect(id.type).to.equal(type) expect(id.toString()).to.equal(peerId.toString()) expect(id.toCID().toString()).to.equal(peerId.toCID().toString())