以太坊的 ChainId 与 NetworkId

这篇文章主要介绍了以太坊的 ChainId 与 NetworkId ,文中通过代码以及文档配合进行讲解,很详细,它对在座的每个人的研究和工作具有很经典的参考价值。 如果需要,让我们与区块链资料网一起学习。

https://www.interchains.cc/21223.html

以太坊的 ChainId 与 NetworkId是很好的区块链资料,他说明了区块链当中的经典原理,可以给我们提供资料,以太坊的 ChainId 与 NetworkId学习起来其实是很简单的,

不多的几个较为抽象的概念也很容易理解,之所以很多人感觉以太坊的 ChainId 与 NetworkId比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难

以太坊eth的 ChainId 与 NetworkId

  • ChainId
  • Eips

不知道你有没有碰到过这样的情况:自己搭了个私链,但通过 MetaMask 或类似工具总是转账失败,最后把 ChainId 和 NetworkId 改成一致就好了,ChainId 和 NetworkId 真的像很多文章说的那样需要保持一致么?

0x01 什么是 ChainId

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

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

  1. 创建新的 EVM 链时,需要在 genesis 文件中指定 ChainId。这个 ChainId 最好不要和现有任何已经在公开运行的 EVM 链的 ChainId 相同,否则可以一个配置失误就误花掉一笔钱。下面是一个 genesis 文件配置示例。已经被占用的 ChainId 可以通过这个列表查看。

    { "config": { "chainID": 1024, "homesteadBlock": 0, "eip155Block": 0, "eip158Block": 0 }, "alloc": {}, "coinbase": "0x3333333333333333333333333333333333333333", "difficulty": "0x400", "extraData": "0x00", "gasLimit": "0x8000000", "nonce": "0x0000000000000042", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "timestamp": "0x00" }
  2. 签名交易时,最好指定 ChainId,现在各种 SDK 库基本上都支持指定 ChainId 签名,比如 web3j 就提供了两种签名 API。当前的以太坊eth应该是两种签名都支持。

    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); }
  3. 使用 MetaMask 去连接不同于以太坊eth的 EVM 网络时,比如我们自己搭的私链或以太经典之类和以太坊eth大致兼容的区块链blockchain网络,最好指定选填的 ChainID,否则可能会遇到交易无法发出的情况。 <a href=以太坊eth的 ChainId 与 NetworkId” />

0x02 什么是 NetworkId

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

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

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

0x03 ChainId 和 NetworkId 是一回事么

不是。 这个根据上面的介绍可以很明显的看出,两者并没有非常高的关联度。 网上几乎所有提到搭建以太坊eth私链的文章,都要强调 NetworkId 需要和 genesis 文件里 ChainId 的值相同。事实上是没必要的。 就像下面这张图展示的这样,很多已经在主网运行的 EVM 链,它们的 ChainId 和 NetworkId 并不相同。比如以太经典,它的 ChainId 是 61,但 NetworkId 和以太坊eth主网一样都是 1。 <a href=以太坊eth的 ChainId 与 NetworkId” />

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

0x04 总结

  1. ChainId 是用来防止交易在不同的以太坊eth同构网络进行交易重放的。主要在交易签名和验证的时候使用。
  2. NetworkId 是用来标识区块链blockchain网络的。主要在节点之间握手并相互检验的时候使用。
  3. ChainId 需要在 genesis 文件中指定,NetworkId 需要在启动参数中指定。
  4. ChainId 和 NetworkId 的值不需要相同。

部分转自网络,侵权联系删除www.interchains.cchttps://www.interchains.cc/21223.html

区块链毕设网(www.interchains.cc)全网最靠谱的原创区块链毕设代做网站 部分资料来自网络,侵权联系删除! 最全最大的区块链源码站 ! QQ3039046426
区块链知识分享网, 以太坊dapp资源网, 区块链教程, fabric教程下载, 区块链书籍下载, 区块链资料下载, 区块链视频教程下载, 区块链基础教程, 区块链入门教程, 区块链资源 » 以太坊的 ChainId 与 NetworkId

提供最优质的资源集合

立即查看 了解详情