主页 > imtoken官方最新版 > 区块链交易ID查询 以太坊的 ChainId 和 NetworkId

区块链交易ID查询 以太坊的 ChainId 和 NetworkId

imtoken官方最新版 2023-05-16 06:16:24

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

0x01 什么是ChainId

ChainId 是 EIP-155 引入的标识符,用于区分不同的 EVM 链。如下图所示,主要作用是防止一笔交易在签名后在不同的链上重复提交。最初它主要是为了防止以太坊经典网络上的以太坊交易重放或以太坊网络上的以太坊经典交易重放。在以太坊网络上区块链交易ID查询,通过 Spurious Dragon 从第 2,675,000 块硬分叉升级激活。

EIP-155

区块链交易ID查询

ChainId 的引入带来了哪些影响?

创建新的 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"
}

区块链交易ID查询

签署交易时,最好指定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);
}

在使用MetaMask连接不同于以太坊的EVM网络时,比如我们自己的私有链或者Ethereum Classic,大致兼容以太坊的区块链网络,最好指定可选的ChainID,否则交易可能无法发送出去。

区块链交易ID查询

MetaMask

0x02 什么是 NetworkId

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

区块链交易ID查询

NetworkId不能通过配置文件指定,通过参数--networkid指定。所以我们在启动自己的私有链节点的时候需要记得加上这个参数。如果不加该参数且不指定网络类型,则NetworkId的默认值与以太坊主网相同。

0x03 ChainId 和 NetworkId 是同一个东西吗?

没有。根据上面的介绍,可以清楚的看出两者的关系不是很密切。网上几乎所有提到构建以太坊私有链的文章都强调 NetworkId 需要与 genesis 文件中 ChainId 的值相同。事实上区块链交易ID查询,没有必要。如下图所示,许多已经在主网上运行的 EVM 链具有不同的 ChainId 和 NetworkId。比如以太经典,它的ChainId是61,但是NetworkId像以太坊主网一样是1。

区块链交易ID查询

ChainId 与 NetworkId

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

0x04 摘要 ChainId 用于防止不同以太坊同构网络中的交易重放。主要用于交易签名和验证。 NetworkId 用于标识区块链网络。主要用于节点间握手和相互检查时。 ChainId 需要在 genesis 文件中指定,NetworkId 需要在启动参数中指定。 ChainId和NetworkId的值不需要相同。

本文参与Chainlink社区写作激励计划,好文好收入,有阅读的欢迎加入。