Skip to main content
Parallax runs the Ethereum Virtual Machine, uses Ethereum’s addresses, transaction format and JSON-RPC, and works with most Ethereum libraries unchanged. An Ethereum integration is a good starting point. These are the places where it will not work as it is.

No finalized block

Ethereum’s proof of stake finalizes blocks: after about 13 minutes, a block cannot be reverted without destroying a large amount of stake. Parallax is proof of work. No block is ever final; each new block on top of it only makes replacing it more expensive. The JSON-RPC reflects this. The finalized tag is parsed, but the node never sets a finalized block, so it returns an error. safe is not accepted at all. Count confirmations yourself, from latest, as described in Tracking confirmations, and choose how many with Confirmations.

Legacy transactions only

Parallax never activated London, so there is no EIP-1559 fee market and no base fee. The node rejects type 2 transactions with transaction type not supported. Legacy (type 0) and access-list (type 1) transactions are accepted. Sign legacy transactions with an explicit gasPrice and chain ID 2110. Most libraries choose legacy on their own when blocks have no baseFeePerGas, but set the type explicitly so a library upgrade does not change it. Price them with eth_estimateSmartFee. See Withdrawals.

Block timing

Blocks target 10 minutes, not 12 seconds, and the gaps between them follow a Poisson process: a 30-minute gap is not unusual, and an hour happens. A deposit with 6 confirmations has waited about an hour on average. Size user-facing estimates, timeouts and alerting accordingly. A node whose head is a few minutes old is normal; one whose head is over 2 hours old needs attention (see Health checks).

Mining rewards arrive without a transaction

A block’s reward is held for 100 blocks and then added to the miner’s balance by the protocol itself, with no transaction. The block’s fees are added to the miner’s balance immediately, also with no transaction. If a miner names one of your deposit addresses as its payout address, that address’s balance rises with nothing in any block’s transaction list to explain it. See Balance changes without a transaction.

Transaction lookups cover about a year

Nodes index transactions by hash for the last 52,560 blocks, about one year at 10 minutes. Older transactions are still in their blocks, but eth_getTransactionByHash and eth_getTransactionReceipt return nothing for them. Run your indexing nodes with --txlookuplimit 0 to index the whole chain. See History and indexing.

Contracts must target Berlin

Parallax runs the EVM as of Berlin, with no later fork. If you deploy forwarders, sweepers, batch-payment contracts or multisigs, compile them with evmVersion: "berlin". Solidity 0.8.20 and later emit PUSH0 by default, which is an invalid opcode here, so a contract compiled with the defaults fails on deployment or on its first call. See Opcodes.

Block headers

A Parallax block header carries the same core fields as an Ethereum header, with three differences: no uncles hash, an extra epochStartTime field, and no base fee. The block itself has no uncle list either: it is a header and a list of transactions. A mainnet header, from eth_getHeaderByNumber:

epochStartTime

Parallax launched with Bitcoin’s difficulty rule: retarget every 2,016 blocks, from the time the previous 2,016 took. epochStartTime records when the current 2,016-block window began, so the next retarget can be computed from the header alone. Since block 17,560, mainnet difficulty adjusts every block by ASERT instead, which does not use the field. It is still part of the header and consensus still checks it: a block whose number is a multiple of 2,016 must set it to its own timestamp, and every other block must copy its parent’s.

Computing the block hash

The block hash is the Keccak-256 hash of the RLP encoding of these 15 fields, in this order:
Compared with Ethereum’s pre-London header, sha3Uncles is gone from between parentHash and miner, and epochStartTime is inserted between timestamp and extraData. Code that rebuilds a header from JSON with Ethereum’s field list produces the wrong hash. You only need this if you verify block hashes or headers yourself; the hash field your node returns is already correct. The proof of work is checked against a separate seal hash: the Keccak-256 hash of the RLP encoding of the first 11 fields above (parentHash to timestamp), then extraData, then epochStartTime. Note that epochStartTime comes after extraData here, and mixHash and nonce are left out, because they are the proof-of-work solution. The solution is valid when XHash, run over the seal hash and the nonce, reproduces mixHash and gives a result no greater than (2256 − 1) ÷ difficulty.

Library compatibility

The uncle methods (eth_getUncleByBlockHashAndIndex, eth_getUncleCountByBlockNumber and the rest) exist for compatibility and always return null.