minerMultiaddrs = {
const minerMultiaddrs = []
for (const minerRecord of minersCombined) {
const { miner } = minerRecord
const multiaddrs = {}
for (const chainOrDht of ["chain", "dht"]) {
const record = minerRecord[chainOrDht]
if (record && record.multiaddrs) {
for (const maddr of record.multiaddrs) {
try {
const addr = multiaddr.multiaddr(maddr)
const protos = addr.protos()
const nodeAddress = addr.nodeAddress()
multiaddrs[maddr] ||= {
miner,
maddr,
peerId: record.peerId,
protos,
nodeAddress,
timestamp: record.timestamp,
epoch: record.epoch,
ips: [],
ipAttributes: {}
}
if (record.dnsLookups && !multiaddrs[maddr].dnsLookups) {
multiaddrs[maddr].dnsLookups = record.dnsLookups
}
if (record.epoch > multiaddrs[maddr].epoch) {
multiaddrs[maddr].epoch = record.epoch
multiaddrs[maddr].timestamp = record.timestamp
if (record.dnsLookups) {
multiaddrs[maddr].dnsLookups = record.dnsLookups
}
}
multiaddrs[maddr][chainOrDht] = true
if (protos[0].name === 'ip4' || protos[0].name === 'ip6') {
addIp(nodeAddress.address)
}
if (protos[0].name === 'dns4' || protos[0].name === 'dns6') {
const dnsName = nodeAddress.address
if (record.dnsLookups && record.dnsLookups[dnsName]) {
const dnsLookups = record.dnsLookups[dnsName]
for (const dnsLookup of dnsLookups) {
addIp(dnsLookup.address)
}
}
}
function addIp(ipAddress) {
if (!ip.isPrivate(ipAddress) && ipAddress !== '0.0.0.0') {
if (!multiaddrs[maddr].ips.includes(ipAddress)) {
multiaddrs[maddr].ips.push(ipAddress)
}
multiaddrs[maddr].ipAttributes[ipAddress] ||= {}
multiaddrs[maddr].ipAttributes[ipAddress][chainOrDht] = true
multiaddrs[maddr].ipAttributes[ipAddress].epoch ||= record.epoch
multiaddrs[maddr].ipAttributes[ipAddress].timestamp ||= record.timestamp
if (record.epoch > multiaddrs[maddr].ipAttributes[ipAddress].epoch) {
multiaddrs[maddr].ipAttributes[ipAddress].epoch = record.epoch
multiaddrs[maddr].ipAttributes[ipAddress].timestamp = record.timestamp
}
}
}
} catch (e) {
console.info('Multiaddr exception', miner, maddr, e)
}
}
}
}
for (const maddr in multiaddrs) {
minerMultiaddrs.push(multiaddrs[maddr])
}
}
return minerMultiaddrs
}