当前位置: 首页 > news >正文

以太坊的 ChainId 与 NetworkId

文章目录

  • 一.什么是ChainId
  • 二.什么是 NetworkId
  • 三.ChainId 和 NetworkId 是一回事吗?
  • 四.总结

ChainId 和 NetworkId 真的像很多文章说的那样需要保持一致么?

chainId为了防止双花攻击。 网络ID(NetworkID),主要用来在网络层标识当前的区块链网络。NetworkId 不一致的两个节点无法建立连接。

在以太坊经典从以太坊分叉出来后,为了防止双花攻击,Chain ID在EIP155被引入。

通过在签名信息中加入Chain ID, 避免一个交易在签名之后被重复在不同的链上提交。

网络ID(NetworkID),主要用来在网络层标识当前的区块链网络。NetworkId 不一致的两个节点无法建立连接。

一.什么是ChainId

ChainId 是 EIP-155 引入的一个用来区分不同 EVM 链的一个标识。如下图所示,主要作用就是避免一个交易在签名之后被重复在不同的链上提交。最开始主要是为了防止以太坊交易在以太经典网络上重放或者以太经典交易在以太坊网络上重放。在以太坊网络上是从 2675000 这个区块通过 Spurious Dragon 这个硬分叉升级激活。
image

引入 ChainId 后,带来了哪些影响呢?

  1. 创建新的 EVM 链时,需要在 genesis 文件中指定 ChainId。这个 ChainId 最好不要和现有任何已经在公开运行的 EVM 链的 ChainId 相同,否则可以一个配置失误就误花掉一笔钱。下面是一个 genesis 文件配置示例。已经被占用的 ChainId 可以通过这个列表查看。
{"config": {"chainId": 1024,"homesteadBlock": 0,"eip150Block": 0,"eip155Block": 0,"eip158Block": 0,"byzantiumBlock": 0,"constantinopleBlock": 0,"petersburgBlock": 0,"istanbulBlock": 0},"nonce": "0x0000000000000046","mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000","difficulty": "0x400","coinbase": "0x3333333333333333333333333333333333333333","timestamp": "0x0","parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000","extraData": "0x","gasLimit": "0x800000000000","alloc": {"0x6e60F5243e1a3F0Be3F407b5AFE9e5395ee82aa2":{"balance": "6660010000000000000000000000"}}
}
  1. 签名交易时,最好指定 ChainId,现在各种 SDK 库基本上都支持指定 ChainId 签名,比如 web3j 就提供了两种签名 API。当前的以太坊应该是两种签名都支持。
public static byte[] signMessage(RawTransaction rawTransaction, Credentials credentials) {byte[] encodedTransaction = encode(rawTransaction);Sign.SignatureData signatureData =Sign.signMessage(encodedTransaction, credentials.getEcKeyPair());return encode(rawTransaction, signatureData);}public static byte[] signMessage(RawTransaction rawTransaction, long chainId, Credentials credentials) {byte[] encodedTransaction = encode(rawTransaction, chainId);Sign.SignatureData signatureData =Sign.signMessage(encodedTransaction, credentials.getEcKeyPair());Sign.SignatureData eip155SignatureData = createEip155SignatureData(signatureData, chainId);return encode(rawTransaction, eip155SignatureData);}

二.什么是 NetworkId

NetworkId 主要用来在网络层标识当前的区块链网络。NetworkId 不一致的两个节点无法建立连接。

// status.NetworkID 为对方节点的 NetworkID,network 为当前节点的 NetworkID
if status.NetworkID != network {return errResp(ErrNetworkIDMismatch, "%d (!= %d)", status.NetworkID, network)}

NetworkId 无法通过配置文件指定,智能通过参数 --networkid 来指定。所以我们启动自己私链节点上需要记得加上这个参数。如果不加这个参数也不指定网络类型,默认 NetworkId 的值和以太坊主网一致。

三.ChainId 和 NetworkId 是一回事吗?

不是。
这个根据上面的介绍可以很明显的看出,两者并没有非常高的关联度。
网上几乎所有提到搭建以太坊私链的文章,都要强调 NetworkId 需要和 genesis 文件里 ChainId 的值相同。事实上是没必要的。

很多已经在主网运行的 EVM 链,它们的 ChainId 和 NetworkId 并不相同。比如以太经典,它的 ChainId 是 61,但 NetworkId 和以太坊主网一样都是 1。

之所以很多文章强调 ChainId 和 NetworkId 要保持一致,可能因为在某一段时间内,一些开发工具比如 MetaMask(小狐狸钱包),会把 NetworkId 当作 ChainId 来用。不过现在 MetaMask 已经支持自定义 ChainId,以太坊也添加了 “eth_chainId” 这个 RPC API,相信两者误用的情况会越来越少。

四.总结

  1. ChainId 是用来防止交易在不同的以太坊同构网络进行交易重放的。主要在交易签名和验证的时候使用;
  2. NetworkId 是用来标识区块链网络的。主要在节点之间握手并相互检验的时候使用;
  3. ChainId 需要在 genesis 文件中指定,NetworkId 需要在启动参数中指定;
  4. ChainId 和 NetworkId 的值不需要相同。但最好一致,以免我们记忆混乱。
http://www.xdnf.cn/news/847099.html

相关文章:

  • phoenix索引
  • HBase高阶(一)基础架构及存储原理
  • linux curl命令详解
  • 网络抓包工具Wireshark下载安装使用详细教程
  • 运输管理系统(TMS):一文扫盲,物流、制造业、零售电商都得用
  • 渗透测试-社会工程学与APT攻击
  • Sass:提升CSS开发效率的利器
  • TLS 详解
  • ansible的介绍,安装与部署
  • 数据结构——队列(Queue)
  • Lambda 表达式
  • Linux系统之安装mariadb方法
  • GCC工具详解【Linux知识贩卖机】
  • Maven:mirror和repository 区别、pom.xml 指定仓库地址、releases 和 snapshots 区别
  • 数据要素全流程解析
  • 信息系统项目管理
  • Go编程基础教程:Go网络安全
  • 【kubernetes详解13】-DashBoard部署
  • 网络安全CTF系列培训教程之Web篇-burpsuite爆破弱密码
  • 新建vm 配置环境
  • Spring Cloud 简介
  • k8s集群的pod理论详解
  • Python爬虫详细教程,从零基础入门到精通,看完这一篇就够了!
  • 【机器学习】机器学习是什么?
  • MyBatis-Plus详解
  • Kali 2023年最新版下载安装最全流程功能介绍(内附安装包)
  • 全站最全Tampermonkey 油猴插件指南,不看后悔一辈子
  • Mysql的安装和配置教程(超详细图文)从零基础入门到精通,看完这一篇就够了
  • SQL cast()函数
  • select简单使用