Now my Bitcoin Full Node is fully synchronized and running I thought it would be good to set up some simple monitoring to check it’s still up and up to date with the Bitcoin Blockchain.
Bitnodes API
Helpfully there’s already a site that monitors all the full nodes and also provides a handy API at https://bitnodes.earn.com/ .
If you look at the full list you can see there are currently 9034 full nodes worldwide with 20 up in Denmark.
Since the site already monitors nodes I can cheat and use their API ( https://bitnodes.earn.com/api/) to get the data on my own node. The relevant endpoint is the Node Status endpoint since this returns the UP/DOWN status as well as some other useful information such as what block height the node is currently synchronized to.
To use is very simple, call https://bitnodes.earn.com/api/v1/nodes/80.71.136.204-8333/ using your own IP and port (8333 is standard for Bitcoin Core)
A call to this endpoint for my own node returns this JSON data. I’ve highlighted the status and block height data.
{ "hostname": "", "address": "80.71.136.204", "status": "UP", "data": [ 70015, "/Satoshi:0.18.1/", 1567654046, 1037, 593492, "80-71-136-204.u.parknet.dk", "Copenhagen", "DK", 55.6786, 12.5589, "Europe/Copenhagen", "AS197301", "Parknet F.M.B.A" ], "bitcoin_address": "", "url": "", "verified": false, "mbps": "0.736781" }
Node-RED Integration
So now I have an easy data source, but how to get notifications from this data? This is where Node-RED comes in useful. On my server with Node-RED already installed I create a small workflow that is triggered to run every hour using the insert node.
Once triggered the workflow does the following:
- Call the Bitnode API
- Parses the returned JSON to extract the status and blockchain height
- Calls another API to get the current Bitcoin block height (to compare to my node)
- Formats a payload and sends to Slack using a webhook
Creating a Schedule
Using the inject node it’s possible to set up a schedule for the flow to run. This could be every X seconds, minutes, hours or at a specific time. I’ve set the flow to run every hour.
Parse JSON from Bitnodes
This node parses the returned JSON and saves the status and current block height to variables for later use.
Get Bitcoin Block Height
To get the current height of the Bitcoin Blockchain we can use the Blockchain.info API. Call to https://blockchain.info/q/getblockcount returns the height in plain text.
This is combined with my node data to create a message payload.
Post to Slack
Finally the payload is formatted ready for posting to Slack.
Then sent via the Slack webhook.
This is how the data appears in Slack. You can see the inject node in Node-RED is running the flow every hour and my node is keeping up with the Blockchain as it only every falls a few blocks behind the main chain before catching up again.
So by using Node-RED and minimal coding in JavaScript I’ve set up an automated monitoring tool for my Bitcoin Node where I can see the progress every hour and be notified both on my desktop computer and on mobile 💪
What API did you use to get the current Bitcoin block height?
Hi John, simply use this url to return the plain text block height. http://blockchain.info/q/getblockcount