Go-Ethereum

乙太坊中的chainID是什麼,它與NetworkID有什麼不同,它是如何使用的?

  • March 2, 2022

這裡在乙太坊的 go 實現中進行了描述。

type ChainConfig struct {
   ChainId *big.Int `json:"chainId"` // Chain id identifies the current chain and is used for replay protection

幾個問題:

  1. 與 有何不同networkID
  2. 每個區塊或只是創世區塊都需要並且chainID需要?networkID
  3. 你能舉一個具體的例子來說明它所說chainID的“用於重放保護”是什麼意思嗎?

**編輯:**仍然沒有回答:

如果您設置networkID為 mainnet 之一networkID,但將其他配置變數更改為您想要的任何內容,會發生什麼情況?如果您正在執行本地鏈,為什麼您為 networkID 設置的內容很重要?

它與networkID有何不同?

ChainID 是在EIP-155中引入的,以防止主 ETH 和 ETC 鏈之間的重放攻擊,它們的 networkID 均為1.

它基本上只是區分鏈條的另一種方式。在 EIP-155 之後,ETH 的鏈 ID 為1,而 ETC 的鏈 ID 為61(即使它們仍然具有相同的 networkID 1)。

每個區塊都需要chainID和networkID還是只需要創世區塊?

鏈通常需要它來執行 - 例如,在簽署交易時需要它,這意味著在 ETH 網路上簽署的交易最終具有與在 ETC 上簽署的不同的雜湊值。在 EIP-155 之前,每個網路上的簽名交易看起來都是一樣的,並且可以重放。

編輯:

如何使用chainId 的具體範例。

根據EIP-155 頁面v交易簽名的值取決於 chainID 的值。

如果block.number >= FORK_BLKNUMv = CHAIN_ID * 2 + 35v = CHAIN_ID * 2 + 36,那麼在計算交易的雜湊以進行簽名或恢復時,不是只對前六個元素(即 nonce、gasprice、startgas、to、value、data)進行雜湊,而是對九個元素進行雜湊,v替換為CHAIN_ID,r = 0s = 0。目前存在的簽名方案使用v = 27v = 28保持有效,並繼續按照與現在相同的規則執行。

在 EIP-155 頁面上有一個如何應用它的詳細範例。

引用自:https://ethereum.stackexchange.com/questions/37533