在以太坊及其丰富的生态系统中,开发者、用户和节点操作者经常需要与不同的网络进行交互,除了我们熟知的以太坊主网(Mainnet),还存在众多测试网络(如Ropsten, Kovan, Goerli, Sepolia)以及各种兼容网络(如各种基于以太坊虚拟机EVM的侧链、Layer 2解决方案),为了确保客户端、钱包、DApp等能够准确无误地连接到目标网络,而不是误连到其他网络,一个关键的标识符应运而生——那就是 NetworkID。
什么是 NetworkID?

NetworkID(网络ID)是一个在以太坊网络中用于唯一标识一个特定网络的数值,它被编码在区块链的每个区块头中,因此是网络的一个固有属性,当以太坊节点(如Geth或Parity客户端)启动时,它会通过NetworkID来识别自己所处的网络环境。
NetworkID就像是每个以太坊网络的“身份证号码”,确保了不同网络之间的数据隔离和正确路由,如果两个网络的NetworkID相同,那么它们被视为同一个网络,节点之间可以互相连接和同步数据;反之,则被视为不同的网络,节点之间不会尝试同步。
NetworkID 与 ChainID 的区别与联系

在讨论NetworkID时,常常会提到另一个概念——ChainID(链ID)。ChainID是在以太坊君士坦丁堡硬分叉(Constantinople Hard Fork,2019年2月)引入的,主要目的是为了防范“重放攻击”(Replay Attack)。
- NetworkID:主要用于网络层的识别,决定节点是否连接和同步,它更偏向于“网络环境”的标识。
- ChainID:主要用于交易签名和广播时的防重放,交易中包含
ChainID,使得该交易在另一个网络上广播时,会因为ChainID不匹配而被拒绝执行,从而防止了交易在不同网络间的意外重放。
在大多数情况下,特别是对于以太坊官方网络和主流兼容网络,NetworkID和ChainID的值是相同的,这简化了开发者的理解和使用,从技术定义上讲,它们是两个不同的概念,服务于不同的目的,一些自定义的测试网络或私有网络可能会设置不同的NetworkID和ChainID,尽管这种情况相对少见。
常见的以太坊 NetworkID 值

以下是一些常见以太坊网络的NetworkID(通常与ChainID相同):
- 以太坊主网 (Mainnet):
1 - Ropsten 测试网 (即将废弃):
3 - Rinkeby 测试网 (已废弃):
4 - Goerli 测试网 (已废弃,但仍有残留):
5 - Sepolia 测试网:
11155111 - Görli 测试网 (旧称,与Goerli相同,注意区分大小写和拼写):
5(同上) - POA Network Sokol 测试网:
77 - POA Network Core 主网:
99 - xDai Chain (现为Gnosis Chain):
100 - Binance Smart Chain (BSC) 主网:
56 - Polygon (Matic) 主网:
137 - Avalanche C-Chain 兼容网:
43110 - Arbitrum One 主网:
42161 - Optimism 主网:
10
NetworkID 的应用场景
NetworkID在以太坊生态系统中有着广泛的应用:
- 节点配置与启动:运行以太坊节点时,可以通过
--networkid参数指定要加入的网络。geth --networkid 3就是启动一个连接到Ropsten测试网的节点。 - 钱包与DApp连接:MetaMask等钱包会根据用户选择的网络(主网、测试网或其他网络)自动配置正确的
NetworkID,确保用户与正确的网络交互,DApp后端也会根据NetworkID来验证请求的来源和合法性。 - 交易广播与执行:虽然交易中主要包含
ChainID用于防重放,但节点在接收和广播交易时,也会结合NetworkID来确保交易在正确的网络上下文中处理。 - 网络隔离与测试:开发者在测试智能合约或DApp时,需要在测试网上进行,而不会影响主网资产。
NetworkID确保了测试环境的独立性和安全性,对于私有链或联盟链,设置独特的NetworkID是与其他公开网络隔离的基本手段。 - 跨链交互与桥接:在涉及跨链桥接或与多个EVM兼容网络交互的场景下,准确识别每个网络的
NetworkID是确保资产和数据正确路由的前提。
如何查看 NetworkID?
- 通过节点客户端:运行以太坊节点客户端(如Geth)并连接到目标网络后,可以通过命令行查看,在Geth控制台输入
eth.networkVersion,返回的即为当前网络的NetworkID(通常以字符串形式表示,如"1", "5"等)。 - 区块链浏览器:一些区块链浏览器会显示当前网络的
NetworkID或ChainID信息,通常在网络的“信息”或“状态”页面可以找到。 - 智能合约:在智能合约中,可以通过
block.chainid(Solidity 0.8.0+)来获取当前网络的ChainID,其值通常与NetworkID对应。
注意事项
- 唯一性:确保你的自定义网络(如私有链)拥有一个与其他已知网络不冲突的
NetworkID,以避免意外的连接和数据混乱。 - 与ChainID的协同:在设置自定义网络时,
NetworkID和ChainID通常建议设置为相同的值,除非你有特殊的需求和深入的理解。 - 测试网更新:以太坊社区会不定期地推出新的测试网或废弃旧的测试网(如Ropsten、Rinkeby的废弃),因此对应的
NetworkID也会变化,开发者需要关注官方动态。
NetworkID是以太坊网络架构中一个看似基础却至关重要的组成部分,它像一张无形的网,将不同的以太坊网络(主网、测试网、侧链等)清晰地区分开来,保障了网络的正确运行、资产的安全以及开发测试的有效性,无论是对于节点运维者、钱包开发者、DApp构建者,还是普通用户,理解NetworkID的含义和应用,都能更好地在纷繁复杂的以太坊生态中导航,确保与目标网络的顺畅、安全交互,随着以太坊生态的不断扩展和技术的演进,NetworkID仍将继续扮演其不可或缺的角色。

