Public
Edited
Sep 21, 2023
Insert cell
Insert cell
Insert cell
Insert cell
await client.version()
Insert cell
chainHead = await client.chainHead()
Insert cell
Insert cell
Insert cell
viewof interactiveEpoch = html`<input type=range max=${currentEpoch} value=${currentEpoch - 1} style="width: 100%">`
Insert cell
selectedEpoch = {
// return 142500
return interactiveEpoch
}
Insert cell
selectedDate = epochToDate(selectedEpoch).toISOString()
Insert cell
Insert cell
tipSet = [...tipSetKey].map(obj => obj['/']).sort().join(',')

Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
minTimestamp = dateFns.subDays(new Date(), 7)
Insert cell
recentMiners = {
const recentMinerSet = new Set()
for (const miner of Object.keys(minerPowerLatestReport.miners)) {
if (d3.isoParse(minerPowerLatestReport.miners[miner].timestamp) > minTimestamp) {
recentMinerSet.add(miner)
}
}
return [...recentMinerSet]
}
Insert cell
Insert cell
Insert cell
testMiner = 'f02620'
Insert cell
testMinerInfo = client.stateMinerInfo(testMiner, tipSetKey)
Insert cell
async function* minerInfoStream() {
const concurrency = 15
const callMinerInfoStream = transform(concurrency, async miner => {
try {
const minerInfo = (await client.stateMinerInfo(miner, tipSetKey))
let controlAddresses = minerInfo.ControlAddresses
let multiaddrs = minerInfo.Multiaddrs
let multiaddrsDecoded
if (multiaddrs) {
let decodedAddrs = []
for (const maddrBin of multiaddrs) {
try {
decodedAddrs.push(new Multiaddr(
Buffer.from(maddrBin, 'base64')
).toString())
} catch (e) {
console.error('Error decoding maddr', maddrBin, e)
}
}
if (decodedAddrs.length > 0) {
multiaddrsDecoded = decodedAddrs.sort()
}
multiaddrs.sort()
}

return {
miner,
owner: minerInfo.Owner,
worker: minerInfo.Worker,
newWorker: minerInfo.NewWorker,
controlAddresses,
workerChangeEpoch: minerInfo.workerChangeEpoch,
peerId: minerInfo.PeerId,
multiaddrs,
multiaddrsDecoded,
windowPoStProofType: minerInfo.WindowPoStProofType,
sectorSize: minerInfo.SectorSize,
windowPoStPartitionSectors: minerInfo.WindowPoStPartitionSectors,
consensusFaultElapsed: minerInfo.ConsensusFaultElapsed
}
} catch (e) {
console.error('Fetch error', e)
return {}
}
})
let counter = 0
let errors = 0
for await (const minerInfo of callMinerInfoStream(recentMiners)) {
if (minerInfo.miner) {
yield {
counter,
errors,
epoch: selectedEpoch,
...minerInfo
}
} else {
errors++
}
counter++
}
}
Insert cell
// minerInfoStream()
Insert cell
minerInfo = {
let records = []
let totalErrors = 0
const startTime = new Date()
for await (const {counter, errors, epoch, ...record} of minerInfoStream()) {
totalErrors = errors
if (epoch) {
records.push(record)
yield {
state: "streaming",
elapsed: ((new Date()) - startTime) / 1000,
recordsLength: records.length,
errors
}
}
}
const endTime = new Date()
yield {
state: "done",
elapsed: (endTime - startTime) / 1000,
records,
startTime,
endTime,
errors: totalErrors
}
}
Insert cell
minerInfo.state === 'done' && md`Miner | Sector Size | Peer ID | Control Addresses | Multiaddrs
---|---|---|---|---
${minerInfo.records.slice(0, maxRows).map(({ miner, sectorSize, peerId, controlAddresses, multiaddrs, multiaddrsDecoded }) => {
const controlCount = controlAddresses ? controlAddresses.length : ''
const multiaddrsFormatted = multiaddrs ? multiaddrsDecoded.join(' ') : ''
const peerIdFormatted = peerId ? peerId.slice(0, 10) + '...' + peerId.slice(-8) : ''
let lines = `${miner} | ${bytes(sectorSize, { mode: 'binary' })} | ${peerIdFormatted} | ${controlCount} | ${multiaddrsFormatted}\n`
return lines
})}
`
Insert cell
maxRows = 190
Insert cell
Insert cell
LotusRPC = (await import('@filecoin-shipyard/lotus-client-rpc')).LotusRPC
Insert cell
BrowserProvider = (await import('@filecoin-shipyard/lotus-client-provider-browser')).BrowserProvider
Insert cell
schema = (await import('@filecoin-shipyard/lotus-client-schema')).mainnet.fullNode
Insert cell
Insert cell
Object.keys(schema.methods)
Insert cell
Insert cell
endpointUrl = {
return "wss://lotus.miner.report/mainnet_api/0/node/rpc/v0"
// return "https://api.node.glif.io/rpc/v0"
}
Insert cell
client = {
const provider = new BrowserProvider(endpointUrl)
return new LotusRPC(provider, { schema })
}
Insert cell
Insert cell
transform = (await import('streaming-iterables@7.1.0')).transform
Insert cell
import { epochToDate } from '@jbenet/filecoin-chain-time-calculator'
Insert cell
bytes = (await import('@jimpick/bytes-iec@3.1.0-2')).default
Insert cell
Multiaddr = (await require('https://bundle.run/multiaddr@9.0.1')).Multiaddr
Insert cell
Buffer = (await require('https://bundle.run/buffer@6.0.3')).Buffer
Insert cell
maddrBin = Buffer.from('BLaDBMMGf/g=', 'base64')
Insert cell
(new Multiaddr(maddrBin)).toString()
Insert cell
Insert cell
Insert cell
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