Compare commits

..

No commits in common. "4250faf5325c807c677782100894e0b8e836af56" and "a587555750bd09d8f22f69803b55429ca6423b10" have entirely different histories.

2 changed files with 57 additions and 64 deletions

View file

@ -26,7 +26,7 @@ jobs:
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: "20"
node-version: "19"
- name: Cache dependencies
uses: actions/cache@v3

View file

@ -35,21 +35,6 @@ Since the Monero remote nodes that I monitor are increasing and my page that dis
## Updates
### Update 2024-01-31 (Breaking Changes)
- API endpoint moved from `https://www.ditatompel.com/api/monero/remote-node` to `https://api.ditatompel.com/monero/remote-node`.
- `x-ditatompel-rate-limit-*` headers removed, no rate limit for now.
- Indication "unchecked node statuses" in `data[].last_check_statuses[]` changed from `null` to `2`.
- Added into `json` field:
- `data[].ip`, `data[].date_entered`, `data[].latitude`, and `data[].longitude`
- Removed from `json` field:
- `success`
- `data[].postal`
Diff: [013aa7d](https://github.com/ditatompel/insights/commit/013aa7db35edd28e72907d5786fcf8877a5a3e70#diff-a8f1b286fbca7e5d241e20d067c8b17a67b86cc142d10dc7cc23cbc9fcc0e332L139-L167).
Because I [refactoring my backend]({{< ref "/blog/rewriting-ditatompel-site-to-svelte-tailwind-and-go/index.md" >}}), there will most likely be another breaking changes in the near future.
### Update 2023-05-24
- I've add `cors` and `last_check_statuses` to nodes data record.
@ -62,7 +47,7 @@ Because I [refactoring my backend]({{< ref "/blog/rewriting-ditatompel-site-to-s
## Endpoint and Query Parameters
| Method | Endpoint |
| ------ | ------------------------------------------------- |
| GET | `https://api.ditatompel.com/monero/remote-node` |
| GET | https://www.ditatompel.com/api/monero/remote-node |
The response will display all the Monero remote node sorted from the highest percentage of uptime.
@ -87,90 +72,98 @@ Optional query string parameters:
For example, if you want to **list CORS enabled Monero nodes using https from United States sorted from recently checked node**:
```shell
curl -sL 'https://api.ditatompel.com/monero/remote-node?cors=true&protocol=https&country=us&orderby=lastcheck-desc' | jq
curl -sL 'https://www.ditatompel.com/api/monero/remote-node?cors=true&protocol=https&country=us&orderby=lastcheck-desc' | jq
```
## Response Header
The response header includes the **HTTP status code** and the `content-type`. Clients that receive a HTTP status code other than `200` and `content-type` other than `application/json` must back-off.
In addition, I added custom headers `x-ditatompel-rate-limit-*` to limit users from making excessive queries to the server.
- `x-ditatompel-rate-limit-limit`: Your IP address initial quota for given period.
- `x-ditatompel-rate-limit-remaining`: Approximate number of requests left to use.
- `x-ditatompel-rate-limit-reset`: Approximate number of seconds to end of period.
The ratelimits period is currently set to 1 hour and initial quota is 3600 requests. It means 1 request every second per IP (you won't get different result if you perform same API calls in short period of time anyway).
## Response Body
The response body includes the information of the query result, query status, and response message. In the example below, the response body of:
The response body includes the information of the query result, query status, and error messages, if available, and metadata for debugging purpose. In the example below, the response body of:
```shell
curl -sL 'https://api.ditatompel.com/monero/remote-node?country=de' | jq
curl -sL 'https://www.ditatompel.com/api/monero/remote-node?protocol=https&country=id' | jq
```
```json
{
"success": 1,
"status": "ok",
"message": "Query Ok",
"message": "Query success",
"data": [
{
"hostname": "xmr-node.cakewallet.com",
"ip": "172.104.202.210",
"port": 18081,
"protocol": "http",
"hostname": "xmrnode1.ditatompel.com",
"port": 443,
"ip_address": "103.244.206.102",
"protocol": "https",
"is_tor": false,
"is_available": true,
"status": "online",
"nettype": "mainnet",
"last_height": 3074012,
"adjusted_time": 1706708935,
"database_size": 193273528320,
"difficulty": 255349054158,
"node_version": "",
"uptime": 99.95,
"last_height": 2892329,
"adjusted_time": 1684869115,
"database_size": 171798691840,
"difficulty": 282381487137,
"uptime": 99.49,
"estimate_fee": 20000,
"asn": 63949,
"asn_name": "Akamai Connected Cloud",
"cc": "DE",
"country_name": "Germany",
"city": "Frankfurt am Main",
"latitude": 1.2868,
"longitude": 103.8503,
"date_entered": 1632724330,
"last_checked": 1706708889,
"asn": 131759,
"asn_name": "IDNIC-WDS-AS-ID",
"country": "ID",
"city": "Tangerang",
"postal": 0,
"last_checked": 1684869296,
"cors": true,
"last_check_statuses": [
null,
1,
1,
1,
0,
1,
1
],
"cors": false
]
}
]
],
"@meta": {
"cache": true,
"ttl": 32,
"response_time": 0.332
}
}
```
- `success`: *unsigned int*, `1` means everything looks good.
- `status`: *string*, `ok` means everything looks good.
- `message`: *string*, Information related to your query, *success* or *error* message if any.
- `data`: *array* of nodes structure as follows:
- `hostname`: *string*; The hostname / nodes IP address.
- `ip`: *string*; The IP address of node, empty string if hostname is not resolveable (Eg.: TOR nodes)
- `hostname`: *string*, The hostname / nodes IP address.
- `port`: *unsigned int*; TCP port the nodes is using to listen to RPC calls.
- `protocol`: *string*; The protocol used by nodes to listen RPC calls. This can be `http`, `https` or `empty string`.
- `is_tor`: *boolean*; whether the node is accessed through the Tor network.
- `is_available`: *boolean*; whether the node is online or not. False may means node wasn't ready or my bots can't connect to nodes RPC daemon.
- `protocol`: *string*, The protocol used by nodes to listen RPC calls. This can be `http`, `https` or `empty string`.
- `is_tor`: *boolean*, whether the node is accessed through the Tor network.
- `status`: *string*, General Monero daemon RPC status. `online` means everything looks good and nodes is syncronized to the network, `offline` means node wasn't ready or my bots can't connect to nodes RPC daemon.
- `nettype`: *string*; Network type (one of `mainnet`, `stagenet` or `testnet`).
- `last_height`: *unsigned int*; Current length of longest chain known to daemon.
- `adjusted_time`: *unsigned int*; Current time approximated from chain data, as Unix time.
- `database_size`: *unsigned int*; The size of the blockchain database, in bytes.
- `difficulty`: *unsigned int*; Least-significant 64 bits of the 128-bit network difficulty.
- `node_version`: *string*; Vesion of remote monero node is running.
- `uptime`: *float*; Uptime percentage of nodes for last 1 month. This likely **not** the real uptime value since my bots may experiencing network problems (I set connection timeout for 60 seconds).
- `uptime`: *float*, Uptime percentage of nodes for last 1 month. This likely **not** the real uptime value since my bots may experiencing network problems (I set connection timeout for 10 seconds).
- `estimate_fee`: *unsigned int*; Amount of fees estimated per byte in atomic units. This just fee estimation, Malicious actors who running remote nodes [still can return high fee only when you about to create a transactions](monero-tx-fee-node.jpg).
- `asn`: *unsigned int*; The AS number that owns nodes IP address, `0` if no information available.
- `asn_name`: *string*; The AS name that owns nodes IP addres.
- `country`: *string*; two-letter ISO 3166-1 country code nodes location, empty string if no information available.
- `city`: *string*; City location based on nodes IP address, empty string if no information available.
- `latitude`: *float*; Approx. latitude (geographic coordinate).
- `longitude`: *float*; Approx. longitude (geographic coordinate).
- `date_entered`: *unsigned int*, The Unix time when my bots start monitoring the node.
- `last_checked`: *unsigned int*, The Unix time when was the last time my bot checked into a monero node.
- `last_check_statuses`: *array* (size: `5`); last node avaibility status. Possible values:
- `asn`: *unsigned int*, The AS number that owns nodes IP address.
- `asn_name`: *string*, The AS name that owns nodes IP address
- `country`: *string*, two-letter ISO 3166-1 country code nodes location, empty string if no information available.
- `city`: *string*, City location based on nodes IP address, empty string if no information available.
- `postal`: *unsigned int*, Postal code based on nodes IP address, `0` if no information available.
- `last_checked`: *unsigned int*, The Unix time when my bots check the nodes status.
- `cors`: *boolean*, whether the node return with `Access-Control-Allow-Origin` header or not.
- `last_check_statuses`: *array* (size: 5) of last node status avaibility status. Possible values:
- `null` : not yet checked.
- `0`: Offline
- `1`: Online
- `2`: not yet checked.
- `cors`: *boolean*, whether the node return with `Access-Control-Allow-Origin` header or not.
- `@meta`: *object*, Additional information related to API calls for debuging purpose.
> You will get `200` response code, `ok` status, and **empty array** of data even if your query return no data.