Published
Edited
Jul 30, 2021
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
Type JavaScript, then Shift-Enter. Ctrl-space for more options. Arrow ↑/↓ to switch modes.

Insert cell
allMiners = await client.stateListMiners(tipSetKey)
Insert cell
totalPower = (await client.stateMinerPower('<empty>', tipSetKey)).TotalPower
Insert cell
Insert cell
import { annotatedMinerIndexes as trackedMiners } from '@jimpick/miner-report-feeds'
Insert cell
trackedMiners
Insert cell
miners = {
const temp = new Set(allMiners)
for (const miner of trackedMiners) {
temp.delete(miner)
}
return d3.shuffle([...temp])
}
Insert cell
Insert cell
Insert cell
async function* minerPowerStream() {
const concurrency = 15
const callMinerPowerStream = transform(concurrency, async miner => {
try {
const minerPower = (await client.stateMinerPower(miner, tipSetKey)).MinerPower
return {
miner,
rawBytePower: Number(minerPower.RawBytePower),
qualityAdjPower: Number(minerPower.QualityAdjPower)
}
} catch (e) {
console.error('StateMinerPower error', e)
return {}
}
})
let counter = 0
for await (const { miner, rawBytePower, qualityAdjPower } of callMinerPowerStream(miners)) {
if (rawBytePower || qualityAdjPower) {
yield {
counter,
epoch: selectedEpoch,
miner,
rawBytePower,
qualityAdjPower
}
} else if (counter % 100 === 0) {
yield {
counter
}
}
if (++counter > scanMax) {
yield {
counter
}
break
}
}
}
Insert cell
// minerPowerStream()
Insert cell
minerPower = {
let records = []
const startTime = new Date()
for await (const {counter, ...record} of minerPowerStream()) {
if (record.epoch) {
records.push(record)
}
yield {
state: "streaming",
counter,
elapsed: ((new Date()) - startTime) / 1000,
records
}
if (records.length >= maxRows) break
}
const endTime = new Date()
yield {
state: "done",
elapsed: (endTime - startTime) / 1000,
records,
startTime,
endTime,
}
}
Insert cell
md`Miner | Raw Byte Power | Quality Adjusted Power
---|---|---
${minerPower.records.sort((a, b) => b.qualityAdjPower - a.qualityAdjPower).slice(0, maxRows).map(({ miner, rawBytePower, qualityAdjPower }) => {
let lines = `${miner} | ${bytes(rawBytePower)} | ${bytes(qualityAdjPower)}\n`
return lines
})}
`
Insert cell
maxRows = 50
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 = "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')).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
d3 = require("d3-array@2", "d3-random@2")
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