使用js-libp2p v1.2.1连接kubo-ipfs v0.27出现ERR_ENCRYPTION_FAILED错误
js-libp2p v1.2.1 连接 kubo-ipfs v0.27 触发 ERR_ENCRYPTION_FAILED 错误
问题概述
基于js-libp2p v1.2.1开发的Node.js应用,连接kubo-ipfs v0.27节点时触发ERR_ENCRYPTION_FAILED错误。测试发现libp2p节点之间可正常建立连接,但连接kubo-ipfs节点或其集群时问题出现。
libp2p配置
export const libp2pOptions = { addresses: { listen, }, transports: [ webSockets({ filter: all, }), circuitRelayTransport({ discoverRelays: 1, }), tcp(), ], connectionEncryption: [noise()], streamMuxers: [yamux()], connectionGater: { denyDialMultiaddr: () => false, }, services: { identify: identify(), pubsub: gossipsub({ allowPublishToZeroPeers: true }), }, peerDiscovery: [ mdns({ interval: 1000 }), bootstrap({ list, timeout: 1000, // 单位:毫秒 tagName: 'bootstrap', tagValue: 50, tagTTL: 120000, // 单位:毫秒 }), ], };
连接逻辑代码
import { createLibp2p } from 'libp2p'; // 导入libp2p模块 import { LevelBlockstore } from 'blockstore-level'; import { createHelia } from 'helia'; import { libp2pOptions } from './libp2pConfig.js'; const blockstore = new LevelBlockstore(blockstorePath); const libp2p = await createLibp2p(libp2pOptions); let ipfs = await createHelia({ libp2p, blockstore }); let node = ipfs.libp2p; const remoteMultiaddr = `/ip4/${PEER_IP}/tcp/${PEER_PORT}/ws/p2p/${PEER_ID}`; const multiAddr = multiaddr(remoteMultiaddr); try { const { status, remoteAddr, remotePeer, direction } = await node.dial( multiAddr ); console.log({ status, remoteAddr, remotePeer, direction }); } catch (error) { console.log(error); } node.addEventListener('peer:discovery', (evt) => { logger.info(`发现节点 ${evt.detail.id.toString()}`); }); node.addEventListener('peer:connect', (evt) => { logger.info(`已连接到 ${evt.detail.toString()}`); });
远程kubo-ipfs节点配置
developer@ipfs-node-1beta:/home/msalimbene$ ipfs version ipfs version 0.27.0 developer@ipfs-node-1beta:/home/msalimbene$ ipfs config show { "API": { "HTTPHeaders": { "Access-Control-Allow-Methods": [ "PUT", "POST" ], "Access-Control-Allow-Origin": [ "http://localhost:3000", "http://127.0.0.1:5001" ] } }, "Addresses": { "API": "/ip4/127.0.0.1/tcp/5001", "Announce": null, "AppendAnnounce": null, "Gateway": "/ip4/127.0.0.1/tcp/8080", "NoAnnounce": null, "Swarm": [ "/ip4/0.0.0.0/tcp/4001", "/ip6/::/tcp/4001", "/ip4/0.0.0.0/udp/4001/quic-v1", "/ip4/0.0.0.0/udp/4001/quic-v1/webtransport", "/ip6/::/udp/4001/quic-v1", "/ip6/::/udp/4001/quic-v1/webtransport" ] }, "AutoNAT": {}, "Bootstrap": [ "/ip4/10.128.0.2/tcp/4001/p2p/QmVKuLVFyBX2ZSyB2w7YLpH4AM7YCdaqdNRjwZa9cR335M" ], "DNS": { "Resolvers": null }, "Datastore": { "BloomFilterSize": 0, "GCPeriod": "1h", "HashOnRead": false, "Spec": { "mounts": [ { "child": { "path": "blocks", "shardFunc": "/repo/flatfs/shard/v1/next-to-last/2", "sync": true, "type": "flatfs" }, "mountpoint": "/blocks", "prefix": "flatfs.datastore", "type": "measure" }, { "child": { "compression": "none", "path": "datastore", "type": "levelds" }, "mountpoint": "/", "prefix": "leveldb.datastore", "type": "measure" } ], "type": "mount" }, "StorageGCWatermark": 90, "StorageMax": "10GB" }, "Discovery": { "MDNS": { "Enabled": true, "Interval": 10 } }, "Experimental": { "FilestoreEnabled": false, "Libp2pStreamMounting": false, "OptimisticProvide": false, "OptimisticProvideJobsPoolSize": 0, "P2pHttpProxy": false, "QUIC": false, "ShardingEnabled": false, "StrategicProviding": false, "UrlstoreEnabled": false }, "Gateway": { "APICommands": [], "DeserializedResponses": null, "DisableHTMLErrors": null, "ExposeRoutingAPI": null, "HTTPHeaders": { "Access-Control-Allow-Headers": [ "X-Requested-With", "Range" ] }, "NoDNSLink": false, "NoFetch": false, "PathPrefixes": [], "PublicGateways": null, "RootRedirect": "", "Writable": false }, "Identity": { "PeerID": "12D3KooWGnC5m82ccmXayxe5qYtH1PupxuXtZpWEe2swTPfbn4Bk" }, "Internal": {}, "Ipns": { "RecordLifetime": "", "RepublishPeriod": "", "ResolveCacheSize": 128 }, "Migration": { "DownloadSources": null, "Keep": "" }, "Mounts": { "FuseAllowOther": false, "IPFS": "/ipfs", "IPNS": "/ipns" }, "Peering": { "Peers": null }, "Pinning": {}, "Plugins": { "Plugins": null }, "Provider": { "Strategy": "" }, "Pubsub": { "DisableSigning": false, "Router": "", "StrictSignatureVerification": false }, "Reprovider": {}, "Routing": { "AcceleratedDHTClient": false, "Methods": null, "Routers": null }, "Swarm": { "AddrFilters": null, "ConnMgr": {}, "DisableBandwidthMetrics": false, "DisableNatPortMap": false, "DisableRelay": false, "EnableRelayHop": false, "RelayClient": {}, "RelayService": {}, "ResourceMgr": {}, "Transports": { "Multiplexers": {}, "Network": {}, "Security": {} } } }
不同加密设置下的错误详情
尝试了多种加密配置,均触发ERR_ENCRYPTION_FAILED错误,具体如下:
- 未配置加密方法:错误为
CodeError: At least one protocol must be specified
CodeError: At least one protocol must be specified at DefaultUpgrader._encryptOutbound (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/upgrader.js:520:19) at async DefaultUpgrader.upgradeOutbound (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/upgrader.js:199:21) at async TCP.dial (file:///Users/salimbene/dev/ipfs/node_modules/@libp2p/tcp/dist/src/index.js:79:22) at async DefaultTransportManager.dial (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/transport-manager.js:81:20) at async queue.add.peerId.peerId [as fn] (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/connection-manager/dial-queue.js:154:38) at async raceSignal (file:///Users/salimbene/dev/ipfs/node_modules/race-signal/dist/src/index.js:28:16) at async Job.run (file:///Users/salimbene/dev/ipfs/node_modules/@libp2p/utils/dist/src/queue/job.js:56:28) { code: 'ERR_ENCRYPTION_FAILED', props: {} }
- 使用
connectionEncryption: [noise()]:错误为CodeError: read ECONNRESET
CodeError: read ECONNRESET at DefaultUpgrader._encryptOutbound (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/upgrader.js:520:19) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async DefaultUpgrader.upgradeOutbound (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/upgrader.js:199:21) at async TCP.dial (file:///Users/salimbene/dev/ipfs/node_modules/@libp2p/tcp/dist/src/index.js:79:22) at async DefaultTransportManager.dial (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/transport-manager.js:81:20) at async queue.add.peerId.peerId [as fn] (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/connection-manager/dial-queue.js:154:38) at async raceSignal (file:///Users/salimbene/dev/ipfs/node_modules/race-signal/dist/src/index.js:28:16) at async Job.run (file:///Users/salimbene/dev/ipfs/node_modules/@libp2p/utils/dist/src/queue/job.js:56:28) { code: 'ERR_ENCRYPTION_FAILED', props: {} }
- 使用
connectionEncryption: [plaintext()]:错误为CodeError: message length length too long
CodeError: message length length too long at DefaultUpgrader._encryptOutbound (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/upgrader.js:520:19) at process.processTicksAndRejections (node:internal/process/task_queues:95:5) at async DefaultUpgrader.upgradeOutbound (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/upgrader.js:199:21) at async TCP.dial (file:///Users/salimbene/dev/ipfs/node_modules/@libp2p/tcp/dist/src/index.js:79:22) at async DefaultTransportManager.dial (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/transport-manager.js:81:20) at async queue.add.peerId.peerId [as fn] (file:///Users/salimbene/dev/ipfs/node_modules/libp2p/dist/src/connection-manager/dial-queue.js:154:38) at async raceSignal (file:///Users/salimbene/dev/ipfs/node_modules/race-signal/dist/src/index.js:28:16) at async Job.run (file:///Users/salimbene/dev/ipfs/node_modules/@libp2p/utils/dist/src/queue/job.js:56:28) { code: 'ERR_ENCRYPTION_FAILED', props: {} }
内容的提问来源于stack exchange,提问作者Matias Salimbene
相关产品推荐
相关产品推荐

