Networks¶
A STRATO node joins the network named by --network. Each network has these properties built into the node:
- its bootnodes
- its genesis block
- its fork heights
Public networks¶
| Mainnet | Testnet | |
|---|---|---|
Network name (--network) |
upquark (default) |
helium |
| Role | Production | Public testnet |
networkID |
33056204878082667 |
114784819836269 |
| EIP-155 chain ID | 0x7030addddcf2 (123354377739506) |
0xb165855668ca (195049586845898) |
| App | app.strato.nexus | app.testnet.strato.nexus |
| Public JSON-RPC | https://noderpc.strato.nexus/rpc, https://app.strato.nexus/rpc |
https://app.testnet.strato.nexus/rpc |
| Block explorer | stratoscan.strato.nexus | stratoscan.testnet.strato.nexus |
| Monitor | https://monitor.strato.nexus |
https://monitor.testnet.strato.nexus |
The source code also defines lithium, a local development network with no bootnodes (networkID 30515246173615469). Other names in the source, such as mercata, mercata-hydrogen and blockappsnet, are legacy networks.
How the IDs are derived¶
Network ID. The networkID is the network name's ASCII bytes read as one big-endian integer. Peers use it to recognize each other.
upquark's ID is larger than JavaScript'sNumber.MAX_SAFE_INTEGER, so handle it as a string.net_versionreturns it as a string.
Chain ID. The EIP-155 chain ID is the first 6 bytes (48 bits) of keccak256(networkName). It is small enough for wallets and JavaScript. eth_chainId returns it in hex.
To check which network a node is on, use either of these:
curl -s https://app.strato.nexus/strato-api/eth/v1.2/metadata
curl -s -X POST -H 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}' \
https://noderpc.strato.nexus/rpc
The metadata response includes these fields:
networkName,networkIDandchainIdisSyncedvalidatorsurls, which lists the OAuth discovery URL, the Vault and the monitor the node uses
Bootnodes and discovery¶
Each public network has a fixed list of bootnode IP addresses compiled into the node (strato/core/strato-networks/src/Blockchain/Network.hs):
upquark: five bootnodeshelium: four bootnodes
Discovery and peering then work like this:
- Seeding. On start-up,
ethereum-discoverloads the bootnodes into the node's peer database. - Discovery. It runs devp2p-style discovery over UDP port 30303. It keeps asking for peers until it knows
--minPeersof them (default 10). - Sync.
strato-p2pconnects to peers over TCP port 30303, up to--maxConnconnections (default 20), and syncs blocks.
Both ports must be reachable (see Requirements).
Genesis¶
strato-setup generates genesis.json for the selected network when it creates a node directory. It builds the file from Haskell templates (strato/core/strato-genesis):
upquarkandheliumshare a template. Each fills it with its own initial validators, admins, bridge configuration and relayer accounts.lithiumhas a separate template.- Pre-placed files take priority: if a
genesis.jsonalready sits in the node directory, setup uses it instead.
Genesis pre-deploys the platform's system contracts:
| Address | Contract | Role |
|---|---|---|
0x100 |
MercataGovernance (proxy; initial logic at 0xff) |
Validator set and network admins (see Consensus) |
0x100c |
AdminRegistry |
Owner of the platform contracts and the only initial admin of MercataGovernance |
0x100d |
FeeCollector |
Receives transaction fees |
0x100e |
Voucher |
Fee vouchers |
0x720 |
UserRegistry |
Username to User contract registry (see Identity and Vault) |
0xDEC1DE |
Decider | Entry point that charges each transaction's fee |
0xDEC1DE02 |
DeciderState |
Points to the current fee implementation |
Genesis also deploys the Mercata DeFi contracts:
LendingPool,LiquidityPool,CollateralVault,PoolConfiguratorandLendingRegistryCDPEngine,CDPRegistry,CDPVaultandCDPReserveMercataBridgePoolFactoryandTokenFactoryRewardsChefandSafetyModule- the initial tokens and swap pools
The node treats USDST (0x937efa7e3a77e20bbdbd7c0d32b6514f368c1010) as the chain's native token. For fees, see Transactions and Fees.
Fork heights¶
Some changes alter consensus: block headers, receipts, or how contract source is parsed. These changes must switch on at the same block on every node, so they are gated by block height.
- New networks use every rule from genesis.
heliumandupquarkkeep the old behavior below each fork height.
Most fork heights are defined in strato/core/vm-tools/src/Blockchain/Forks.hs. A few older SolidVM forks live next to the code they gate.
| Change | helium |
upquark |
Other networks |
|---|---|---|---|
| SolidVM pass-by-reference semantics | 33,918 | Genesis | Genesis |
| Receipts root in block headers | 250,000 | 1,000,000 | Genesis |
| Block-reward event included in the block's first receipt | 300,000 | 1,000,000 | Staking activation height |
| SolidVM Solidity operator precedence | Not scheduled | Not scheduled | Genesis |
Staking activation is set per network in ethconf.yaml (networkConfig), with these defaults:
| Setting | helium |
upquark |
lithium |
New networks |
|---|---|---|---|---|
stakingActivationBlock: stake-weighted proposer selection and votes |
250,000 | 1,000,000 | Not scheduled | Genesis |
stakingEventsFromGovernanceBlock: stake weights read from MercataGovernance |
300,000 | 1,000,000 | Not scheduled | Genesis |
"Not scheduled" is a sentinel height that no real chain reaches.
Warning
Every node on a network must use the same fork and activation heights. Don't override --stakingActivationBlock on a public network.
Domains¶
| Domain | Use |
|---|---|
app.strato.nexus, app.testnet.strato.nexus |
STRATO app and public node APIs |
noderpc.strato.nexus/rpc |
Public mainnet JSON-RPC |
stratoscan.strato.nexus, stratoscan.testnet.strato.nexus |
Block explorer |
monitor.strato.nexus, monitor.testnet.strato.nexus |
Network monitor |
docs.strato.nexus |
This documentation |
go.strato.nexus |
Tracking links |
Shared services still run on blockapps.net:
keycloak.blockapps.net: the OIDC provider, realmmercata.vault.blockapps.net:8093: the shared Vault and the node default. The public testnet app's metadata reports its own Vault,vault-test.blockapps.net:8093.support.blockapps.net: where you request OAuth client credentials.