Git Product home page Git Product logo

filecoin-network-stats's Introduction

filecoin-network-stats

filecoin-network-stats is a visual interface for tracking the state of the Filecoin network. This repository contains two sub projects: the dashboard itself (located in frontend), and a stat collection server (located in backend).

By default, all stats on the frontend are cached for 1 minute unless otherwise noted. The stats collection server waits 4 blocks before considering a block to be 'finalized,' and so will appear to be behind the tip of the chain.

frontend

The filecoin-network-stats frontend is a React/Redux application written in Typescript. It uses AmCharts4 as its charting library. To start the frontend, run the following commands from within the frontend directory:

npm install
npm run dev

npm run dev will point the frontend to a local backend running on port 8081. To point to a different backend, run the following command instead:

BACKEND_URL=<your-backend-url> webpack-dev-server --hot

The dashboard updates itself via a polling loop that hits the backend's /sync endpoint every 5 seconds. This was chosen over WebSockets due to simplicity, and how it allows non-browser clients to query the backend's data as well without having to open a persistent connection.

a note on the debug dependency

debug leaks memory when new instances are called in a loop. Since numerous transitive dependencies of this project do that, the postinstall script replaces debug with a no-op version.

backend

The app's backend is a Node.js application written in Typescript. It talks to a Postgres database and a local go-filecoin full node. The backend will by default listen for heartbeats on port 8080, and incoming API requests on port 8081. To get started running the backend, start by installing dependencies and compiling the application:

cd backend
npm i
npm run build

To start the backend, first create a .env file with the following environment variables in the backend directory:

export DB_URL=<your-postgres-url>
export FULL_NODE_URL=<your-full-node-url>
export IS_MASTER=true
export PEER_INFO_FILE=./peerId.json
export HEARTBEAT_PORT=8080
export API_PORT=8081
export LOG_LEVEL=info

Then, create a peerId.json by running the following command from your backend directory:

node -e "require('peer-id').create({ bits: 1024 }, (err, id) => { if (err) { throw err; } console.log(JSON.stringify(id.toJSON(), null, 2))})" > peerId.json

The above steps only need to be performed on fresh installations. Next, you'll need to migrate the database via the following command:

DATABASE_URL=<your database url> db-migrate up

Now you're ready to start your node:

source ./.env && node ./dist/src/main.js

That's it! You're off to the races. To collect statistics on node counts and locations, ask miners to set their node's heartbeatUrl and nickname, like this:

go-filecoin config heartbeat.nickname '"Pizzanode"'
go-filecoin config heartbeat.beatTarget "/dns4/<your-backend-domain-name>/tcp/8080/ipfs/<your-peer-id>"

REST API

The backend exposes a REST API for some stats:

Endpoint Description
/stats/storage/historicalMinerCounts/:duration((all|24h|1w|1m|1y)) Returns the number of heartbeating miners over time.
/stats/storage/historicalStoragePrice/:duration((all|24h|1w|1m|1y)) Returns the average price of storage (in FIL) over time.
/stats/storage/historicalCollateral/:duration((all|24h|1w|1m|1y)) Returns the amount of total pledged storage collateral (in FIL) over time.
/stats/storage/historicalCollateralPerGB/:duration((all|24h|1w|1m|1y)) Returns the amount of pledged storage collateral per GB (in FIL) over time.
/stats/storage/historicalStorageAmount/:duration((all|24h|1w|1m|1y)) Returns the historical amount of network storage (in GB) over time.
/stats/storage/historicalUtilization/:duration((all|24h|1w|1m|1y)) Returns historical network utilization (as a %) over time.
/stats/token/historicalBlockRewards/:duration((all|24h|1w|1m|1y)) Returns the historical block rewards (in FIL) over time.
/stats/token/historicalCoinsInCirculation/:duration((all|24h|1w|1m|1y)) Returns the number of coins in circulation over time.

The dashboard uses these to populate historical graphs when the user toggles between timeframes. You can also make a GET request to /sync to retrieve all of the stats that the dashboard uses to update itself.

more info

For more information about the backend, check out docs/backend.md.

a note about local development

You may find it easier to npm link the filecoin-network-stats-common dependency if you're actively developing. To do so, run these commands from the root of the repo:

cd common
npm run build
npm link
cd ../frontend
npm link filecoin-network-stats-common
cd ../backend
npm link filecoin-network-stats-common

Then, run npm run build from the common directory whenever you make changes to common dependencies. This prevents you from having to re-run npm install every time you change something in common.

filecoin-network-stats's People

Contributors

mishmosh avatar mslipper avatar pooja avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.