乙太坊中的chainID是什麼,它與NetworkID有什麼不同,它是如何使用的?
這裡在乙太坊的 go 實現中進行了描述。
type ChainConfig struct { ChainId *big.Int `json:"chainId"` // Chain id identifies the current chain and is used for replay protection
幾個問題:
- 與 有何不同
networkID
?- 每個區塊或只是創世區塊都需要並且
chainID
需要?networkID
- 你能舉一個具體的例子來說明它所說
chainID
的“用於重放保護”是什麼意思嗎?**編輯:**仍然沒有回答:
如果您設置
networkID
為 mainnet 之一networkID
,但將其他配置變數更改為您想要的任何內容,會發生什麼情況?如果您正在執行本地鏈,為什麼您為 networkID 設置的內容很重要?
它與networkID有何不同?
ChainID 是在EIP-155中引入的,以防止主 ETH 和 ETC 鏈之間的重放攻擊,它們的 networkID 均為
1
.它基本上只是區分鏈條的另一種方式。在 EIP-155 之後,ETH 的鏈 ID 為
1
,而 ETC 的鏈 ID 為61
(即使它們仍然具有相同的 networkID1
)。每個區塊都需要chainID和networkID還是只需要創世區塊?
鏈通常需要它來執行 - 例如,在簽署交易時需要它,這意味著在 ETH 網路上簽署的交易最終具有與在 ETC 上簽署的不同的雜湊值。在 EIP-155 之前,每個網路上的簽名交易看起來都是一樣的,並且可以重放。
編輯:
如何使用chainId 的具體範例。
根據EIP-155 頁面,
v
交易簽名的值取決於 chainID 的值。如果
block.number >= FORK_BLKNUM
和v = CHAIN_ID * 2 + 35
或v = CHAIN_ID * 2 + 36
,那麼在計算交易的雜湊以進行簽名或恢復時,不是只對前六個元素(即 nonce、gasprice、startgas、to、value、data)進行雜湊,而是對九個元素進行雜湊,v
替換為CHAIN_ID
,r = 0
和s = 0
。目前存在的簽名方案使用v = 27
和v = 28
保持有效,並繼續按照與現在相同的規則執行。在 EIP-155 頁面上有一個如何應用它的詳細範例。