Public
Edited
Jun 5, 2022
1 star
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
minerInfoSubsetLatest
Insert cell
Insert cell
Insert cell
Insert cell
minMinerInfoTimestamp = dateFns.subDays(new Date(), 7)
Insert cell
minDhtTimestamp = dateFns.subDays(new Date(), 7)
Insert cell
miners = {
const miners = new Set()
for (const miner in minerInfoSubsetLatest.miners) {
const timestamp = new Date(minerInfoSubsetLatest.miners[miner].timestamp)
if (timestamp < new Date(minMinerInfoTimestamp)) continue
if (minerInfoSubsetLatest.miners[miner].multiaddrsDecoded) {
miners.add(miner)
}
}
for (const miner in dhtAddrsLatest.miners) {
const timestamp = new Date(dhtAddrsLatest.miners[miner].timestamp)
if (timestamp < new Date(minDhtTimestamp)) continue
miners.add(miner)
}
return [...miners].sort((a, b) => Number(a.slice(1)) - Number(b.slice(1)))
}
Insert cell
minersCombined = miners.map(miner => {
const record = { miner }
let chain = minerInfoSubsetLatest.miners[miner] && {
epoch: minerInfoSubsetLatest.miners[miner].epoch,
timestamp: new Date(minerInfoSubsetLatest.miners[miner].timestamp),
peerId: minerInfoSubsetLatest.miners[miner].peerId,
multiaddrs: minerInfoSubsetLatest.miners[miner].multiaddrsDecoded,
dnsLookups: minerInfoSubsetLatest.miners[miner].dnsLookups
}
if (chain && chain.timestamp < new Date(minMinerInfoTimestamp)) chain = null
let dht = dhtAddrsLatest.miners[miner] && {
epoch: dhtAddrsLatest.miners[miner].epoch,
timestamp: new Date(dhtAddrsLatest.miners[miner].timestamp),
peerId: dhtAddrsLatest.miners[miner].peerId,
multiaddrs: dhtAddrsLatest.miners[miner].multiaddrs,
dnsLookups: dhtAddrsLatest.miners[miner].dnsLookups
}
if (dht && dht.timestamp < new Date(minDhtTimestamp)) dht = null
if (chain && dht && chain.peerId !== dht.peerId) {
if (dht.timestamp < chain.timestamp) {
dht = null
} else {
chain = null
}
}
if (chain) record.chain = chain
if (dht) record.dht = dht
return record
})
Insert cell
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
}
Insert cell
minerMultiaddrs.filter(({ protos }) => protos[0].name === 'dns4')
Insert cell
minerMultiaddrIps = {
const minerMultiaddrIps = []
for (const minerMultiaddr of minerMultiaddrs) {
for (const ipAddress of minerMultiaddr.ips) {
const record = {
miner: minerMultiaddr.miner,
maddr: minerMultiaddr.maddr,
peerId: minerMultiaddr.peerId,
timestamp: minerMultiaddr.ipAttributes[ipAddress].timestamp.toISOString(),
epoch: minerMultiaddr.ipAttributes[ipAddress].epoch,
ip: ipAddress
}
if (minerMultiaddr.ipAttributes[ipAddress].chain) record.chain = true
if (minerMultiaddr.ipAttributes[ipAddress].dht) record.dht = true
minerMultiaddrIps.push(record)
}
}
return minerMultiaddrIps
}
Insert cell
Insert cell
Insert cell
Insert cell
oldMultiaddrsIpsReport = (await fetch(`${multiaddrsIpsLatestBucketUrl}/multiaddrs-ips-latest.json`)).json()
Insert cell
oldMultiaddrsIpsIndex = {
const index = new Map()
for (const { miner, maddr, ip, epoch } of oldMultiaddrsIpsReport.multiaddrsIps) {
const key = `${miner},${maddr},${ip}`
index.set(key, epoch)
}
return index
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
ip = require('https://bundle.run/ip@1.1.5')
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more