
CompareNodes team have released a light-weight HTTP client optimized for Web3.
We named it MilliNet because it measures round-trip milliseconds from the browser to any mainnet, testnet or devnet as min, max, avg, p50 and p95.
MilliNet works like Postman for POST RPC and GET RESTful requests:
- It is light-weight and runs entirely in the browser, without a backend proxy
- MilliNet measures p50 and p95 round-trip times between the browser and public or private endpoints
- The p95 calculation already utilizes linear interpolation and improvements are in our roadmap
- Users can dispatch single requests or run in loops up to 100, with or without throttling
Standalone and iFrame
- MilliNet can be embedded in an iFrame into any website as a free RPC sandbox / playground
- The standalone UI is available at CompareNodes.com/millinet/
- iFrame configuration params are in this list
- See the black-and-white iFrame below
The iFrame UX is best with width of >=360px and the default configuration without parameters can be achieved with this HTML:
<iframe
src="https://www.comparenodes.com/millinet/millinet-widget/"
style="min-width: 360px; width: 100%; height: 1185px;
border: 1px solid #161618; border-radius:4px">
</iframe>
Click/tap RUN or START buttons to trigger RPC requests:
Optional Configuration
e.g. comparenodes.com/millinet/millinet-widget/?protocolGroup=eth_chainId&endpointURL=https://mainnet.base.org/
| Parameter | Description | URL with Example |
| endpointURL | Fill in the initial value for the Endpoint URL. | &endpointURL=https://mainnet.base.org/ |
| endpointSLD | Set a restriction to second-level-domain: the form will reject values in the Endpoint URL input for domains except those that match the parameter. The example restricts the form to URLs with “onfinality.io” only. | &endpointSLD=onfinality.io |
| showAuthControls | Set it to false to hide the Auth Header pull-down (and its header value input). This option can be useful for sites which offer only public endpoints to make the MilliNet widget/form more compact. | &showAuthControls=false |
| filterAuthHeader | For providers which offer public endpoints and private endpoints with authentication via the header: set this parameter to the specific header and the pulldown will show NO + the parameter. Available values are: x-api-key, apikey, api-key, Authorization, project_id, dmtr-api-key and Drpc-Key. Do not use this parameter with &showAuthControls=false | &filterAuthHeader=apikey |
| selectAuthHeader | For providers which do NOT offer public endpoints and their private endpoints are authorized with an auth header: set this parameter to the auth header that you use and it will be the only selection in the pulldown. Available values are: x-api-key, apikey, api-key, Authorization, project_id, dmtr-api-key and Drpc-Key. Do not use this parameter with &showAuthControls=false | &selectAuthHeader=x-api-key |
| defaultLoop | Use it to replace the MilliNet’s value of 10 with a new default/initial for the loop. Must be >=2. The user can also change it to another value, up to 100 (see parameter maxLoop). | &defaultLoop=5 |
| maxLoop | This parameter should be used to restrict the max value that the user can set for a loop request. Must be >=3 and > defaultLoop, if any. When this value is set to =3, the form will display just the RUN-x1 and START-x3 buttons for a more compact layout. | &maxLoop=25 |
| protocolGroup | Exists to access RPC / RESTful examples for requests to most popular protocols: EVM, UTXO, Substrate, Tendermint, Aptos, Sui, Algorand, NEAR etc. See the next table below with the complete specification. | &protocolGroup=eth_getBlockByNumber |
Values for protocolGroup
For additional configurations msg @SimonRadovcic on TG. Click the link in the table to see a working example:
| Category | &protocolGroup=… | HTTP Verb | Request “Body” |
| Aleo | block_latest | GET | /block/latest |
| Alephium | mempool_transactions | GET | /mempool/transactions |
| Algorand | getstatus | GET | /v2/status |
| Algorand | getversion | GET | /versions |
| Aptos, Movement | get_ledger_info | GET | / |
| Avalanche P-Chain | platform_getTimestamp | POST | {“method”: “platform.getTimestamp”, “params”: {}, “jsonrpc”: “2.0”, “id”: 1} |
| Avalanche X-Chain | avm_getHeight | POST | {“method”: “avm.getHeight”, “params”: {}, “jsonrpc”: “2.0”, “id”: 1} |
| BTC & UTXOs | getblockchaininfo | POST | {“method”: “getblockchaininfo”, “jsonrpc”: “2.0”, “id”: 1} |
| Cardano Ogmios API | ogmios | POST | {“method”: “queryLedgerState/tip”, “jsonrpc”: “2.0”, “id”: 1} |
| Casper | info_get_status | POST | {“method”: “info_get_status”, “jsonrpc”: “2.0”, “id”: 1} |
| EVM | eth_blockNumber | POST | {“method”: “eth_blockNumber”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| EVM | eth_chainId | POST | {“method”: “eth_chainId”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| EVM | eth_getBlockByNumber | POST | {“method”: “eth_getBlockByNumber”, “params”: [“latest”, false], “jsonrpc”: “2.0”, “id”: 1} |
| EVM | eth_getBlockReceipts | POST | {“method”: “eth_getBlockReceipts”, “params”: [“latest”], “jsonrpc”:”2.0″, “id”:1} |
| EVM | eth_getLogs | POST | {“method”: “eth_getLogs”, “params”: [{“fromBlock”: “latest”, “toBlock”: “latest”}], “jsonrpc”:”2.0″, “id”:1} |
| EVM | trace_block | POST | {“method”: “trace_block”, “params”: [“latest”], “jsonrpc”: “2.0”, “id”: 1} |
| Hyperliquid | allMids | POST | {“type”: “allMids”} |
| MultiversX | node_heartbeatstatus | GET | /node/heartbeatstatus |
| NEAR | near_block | POST | {“method”: “block”, “params”: {“finality”: “final”}, “jsonrpc”: “2.0”, “id”: 1} |
| NEAR | near_status | POST | {“method”: “status”, “params”: {}, “jsonrpc”: “2.0”, “id”: 1} |
| Solana, Fogo, Eclipse | getBlockHeight | POST | {“method”: “getBlockHeight”, “params”: [{“commitment”: “finalized”}], “jsonrpc”: “2.0”, “id”: 1} |
| Solana, Fogo, Eclipse | getEpochInfo | POST | {“method”: “getEpochInfo”, “params”: [{“commitment”: “finalized”}], “jsonrpc”: “2.0”, “id”: 1} |
| Solana, Fogo, Eclipse | getGenesisHash | POST | {“method”: “getGenesisHash”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| Solana, Fogo, Eclipse | getSlot | POST | {“method”: “getSlot”, “params”: [{“commitment”: “finalized”}], “jsonrpc”: “2.0”, “id”: 1} |
| Starknet | starknet_blockNumber | POST | {“method”: “starknet_blockNumber”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| Starknet | starknet_chainId | POST | {“method”: “starknet_chainId”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| Starknet | starknet_getBlockWithTxHashes | POST | {“method”: “starknet_getBlockWithTxHashes”, “params”: [“latest”], “jsonrpc”: “2.0”, “id”: 1} |
| Stellar Horizon API | liquidity_pools | GET | /liquidity_pools |
| Stellar Soroban API | getHealth | POST | {“method”: “getHealth”, “jsonrpc”: “2.0”, “id”: 1} |
| Stellar Soroban API | getLatestLedger | POST | {“method”: “getLatestLedger”, “jsonrpc”: “2.0”, “id”: 1} |
| Substrate / Polkadot | chain_getBlock | POST | {“method”: “chain_getBlock”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| Substrate / Polkadot | chain_getBlockHash | POST | {“method”: “chain_getBlockHash”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| Substrate / Polkadot | system_chain | POST | {“method”: “system_chain”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| Sui | sui_getChainIdentifier | POST | {“method”: “sui_getChainIdentifier”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| Sui | sui_getLatestCheckpointSequenceNumber | POST | {“method”: “sui_getLatestCheckpointSequenceNumber”, “params”: [], “jsonrpc”: “2.0”, “id”: 1} |
| Supra | rpc_v2_block | GET | /rpc/v2/block |
| Tendermint / Cosmos | block | GET | /block |
| Tendermint / Cosmos | status | GET | /status |
| Tezos | chains_main_blocks_head | GET | /chains/main/blocks/head |
| TON | getMasterchainInfo | POST | {“method”: “getMasterchainInfo”, “jsonrpc”: “2.0”, “id”: 1} |
| Vaulta ex. EOS | get_info | POST | {} |
| VeChain | blocks_best | GET | /blocks/best?expanded=true&raw=false |
| Waves | node_status | GET | /node/status |
| XRP Ledger / Ripple | ledger | POST | {“method”: “ledger”, “params”: [{“ledger_index”: “current”, “transactions”: true, “expand”: false, “owner_funds”: false}], “jsonrpc”: “2.0”, “id”: 1} |
