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. Thefinalized 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 withtransaction 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, buteth_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 withevmVersion: "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 extraepochStartTime
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: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.
