{"id":"EIP-2124","name":"Fork Identifier","status":"Final","chain":"both","category":{"id":"comprehension","name":"Comprehension & Display","description":"Making blockchain data readable to humans"},"journeyStages":[{"id":"status","name":"Status & Confirmation","description":"Waiting for and confirming outcomes"}],"uxImpact":"Nodes quickly identify compatible peers — faster sync, no wasted connections to wrong networks (ETH vs ETC). Design implications: mostly invisible to end users but affects sync progress UIs, show network compatibility status in node dashboards, display fork identifier in developer tools. Design decisions: how to surface peer compatibility issues to users running nodes, whether to show 'searching for peers' vs specific incompatibility reasons, handling stale nodes gracefully.","hasDetailedContent":true,"content":{"id":"EIP-2124","summary":"EIP-2124 introduced fork identifiers - a way for nodes to quickly check if they're compatible with each other. The fork ID combines the chain's genesis hash with activated fork block numbers. This lets nodes immediately know \"we're on the same chain and have the same upgrades\" without exchanging lots of data.","applicability":{"whenToUse":["Your product addresses: nodes couldn't quickly verify compatibility.","Your product addresses: network partitions after hard forks.","The flow should deliver: fork ID comparison in initial handshake.","You are designing a network upgrade status experience with visible states and recovery paths."],"whenToAvoid":["Warn when connected to incompatible RPC.","Show upgrade countdown with feature summary.","Show fork name (Shanghai) with ID as technical detail.","Users never see addresses, amounts, or signing payloads in your UI."]},"designerTakeaways":["You can design UI that delivers fork ID comparison in initial handshake.","You can design UI that delivers nodes disconnect immediately if fork IDs don't match.","You can design UI that delivers mismatch detected at connection time."],"problemsSolved":[{"problem":"Nodes couldn't quickly verify compatibility","oldWay":"Exchange full chain history to detect incompatibility","newWay":"Fork ID comparison in initial handshake","impact":"high"},{"problem":"Network partitions after hard forks","oldWay":"Incompatible nodes stayed connected, causing issues","newWay":"Nodes disconnect immediately if fork IDs don't match","impact":"high"},{"problem":"Difficult to detect wrong network connections","oldWay":"Errors occurred deep in sync process","newWay":"Mismatch detected at connection time","impact":"medium"},{"problem":"Post-fork network confusion","oldWay":"Old nodes confused new nodes and vice versa","newWay":"Clean separation of incompatible networks","impact":"medium"}],"uxPatterns":[{"name":"Network Upgrade Status","description":"Show users current network fork status","mockup":"concept/verify-safety","userFlow":["User checks network status","Current fork name and ID displayed","Historical upgrades shown","Upcoming upgrades if scheduled","User understands network state"]},{"name":"Node Compatibility Warning","description":"Alert when connecting to incompatible node","mockup":"concept/verify-safety","userFlow":["dApp connects to RPC","Fork ID mismatch detected","Warning shown to user","Explanation of the issue","Option to switch RPC"]},{"name":"Upgrade Countdown","description":"Show upcoming network upgrades","mockup":"concept/verify-safety","userFlow":["Upcoming upgrade detected","Countdown displayed to users","New features explained","Users informed before changes"]}],"uiComponents":[{"name":"ForkIdDisplay","description":"Shows current fork identifier","states":["synced","syncing","outdated"],"props":["forkId","forkName","blockNumber"]},{"name":"UpgradeTimeline","description":"Visual timeline of network upgrades","states":["loading","loaded"],"props":["upgrades[]","currentBlock","onSelect"]},{"name":"CompatibilityCheck","description":"Shows node/RPC compatibility status","states":["compatible","incompatible","checking"],"props":["localForkId","remoteForkId","onSwitch"]}],"antiPatterns":[{"pattern":"Ignoring fork ID mismatches","why":"User may see incorrect data or failed transactions","instead":"Warn when connected to incompatible RPC","severity":"high"},{"pattern":"Not informing users about upcoming upgrades","why":"Users surprised when things change","instead":"Show upgrade countdown with feature summary","severity":"medium"},{"pattern":"Showing raw fork ID without context","why":"0xdce96c2d means nothing to users","instead":"Show fork name (Shanghai) with ID as technical detail","severity":"low"}],"onMonad":[{"aspect":"Monad Fork Schedule","ethereum":"Upgrades happen roughly yearly","monad":"Monad may have its own upgrade schedule","designImplication":"Track Monad-specific fork IDs and upgrade timeline"},{"aspect":"Fork ID Format","ethereum":"Based on genesis + fork blocks","monad":"Same format, Monad-specific values","designImplication":"Use Monad genesis and fork data for ID calculation"},{"aspect":"Node Compatibility","ethereum":"Many public RPCs with varying update speeds","monad":"Ensure RPC providers stay updated with Monad forks","designImplication":"Verify RPC fork ID matches expected Monad fork"}],"relatedStandards":[{"id":"EIP-155","relationship":"Chain ID identifies the chain, fork ID identifies the fork state"},{"id":"EIP-695","relationship":"eth_chainId returns chain ID, separate from fork ID"}]},"sources":[{"label":"Official specification","url":"https://eips.ethereum.org/EIPS/eip-2124","type":"official-spec"},{"label":"Discussion","url":"https://ethereum-magicians.org/search?q=EIP-2124","type":"discussion"}],"urls":{"canonical":"https://www.eipsfordesigners.com/standards/EIP-2124","markdown":"https://www.eipsfordesigners.com/standards/EIP-2124/content.md","agent":"https://www.eipsfordesigners.com/standards/EIP-2124/agent.md","api":"https://www.eipsfordesigners.com/api/standards/EIP-2124","official":"https://eips.ethereum.org/EIPS/eip-2124","discussion":"https://ethereum-magicians.org/search?q=EIP-2124"},"freshness":{"lastReviewed":"2026-04-05","lastUpdated":"2026-04-05"}}