Transactions

chainId 的欄位大小和取值範圍(EIP-155)

  • February 6, 2018

EIP-155定義了一個鏈 ID 列表,例如主網是 1 Ropsten 是 2。我似乎無法找到關於其假定值範圍和數據大小的定義。

引用黃皮書規則 (287)

假設 v 是“恢復標識符”或“鏈標識符加倍加 35 或 36”。恢復標識符是一個 1 字節的值

文本說如果它是恢復標識符,那麼它被編碼為一個字節。它沒有提到chain identifier doubled plus.

對於這種情況,一個字節似乎chain identifier doubled plus是不夠的:EIP-155 列出1337了 Geth 私有鏈的值。所以可以肯定地說這個欄位(即Tw)可以長於一個字節。如果是這樣的話,不應該用長度前綴編碼嗎?

除了 value 之外1337,其他網路是否有可能擁有更大、更長的 chainId 設置?

從 Geth 程式碼中的各個地方來看,它看起來像是被定義(和處理)為BigInt. (實際的上限將取決於架構。)

例如,在config.go

// MainnetChainConfig is the chain parameters to run a node on the main network.
MainnetChainConfig = &ChainConfig{
   ChainId:        big.NewInt(1),

我假設其他客戶以相似的大小和精度實現它。

Richard Horrocks 的回答是正確的。該欄位沒有大小或值限制(非負部分,請參閱geth 程式碼)。我還在一個具有任意 network_id 的專用網路上進行了測試交易4901。實驗如下。

> eth.sendTransaction({from: ‘0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1’, to: ‘0xad322de69695859fc84f32d0f42c3802fe101843’, value: 8000000000})

輸出交易雜湊為

“0xa0f67799bca1f633f66567455aaeff0728cb72c78d3fff9af0875d4918356c8c”

接下來我們得到原始交易字節

>eth.getRawTransaction(‘0xa0f67799bca1f633f66567455aaeff0728cb72c78d3fff9af0875d4918356c8c’)

結果是

“0xf86e820678850430e2340083015f9094ad322de69695859fc84f32d0f42c3802fe1018438501dcd650008082266ea027caed8171ad1857ff259554614152cda78949adda001e24472f84840bca567cd65acd679eb2f2cd8171b

手動解析字元串: f8 6e (Length) 82 0678 (Nonce) 85 0430e23400 (gasPrice) 83 015f90 (gasLimit) 94 ad322de69695859fc84f32d0f42c3802fe101843 (To address) 85 01dcd65000 (value) 80 (Message call or contract creation data, which is zero length here) 82 266e (V with chain ID, 0x266e = 9838 = 4901 * 2 + 36, 82 is the length prefix) a0 27caed8171ad1857ff259554614152cda78949adda001e24472f84840bca5cd6 (R) a0 4a5f557baae23ce45c97b71363ea8da6740ac2652bd02b7f94b18cae62d7905a (S)

從上面的例子

  • 是的,長度和價值都是無限的
  • 是的,該欄位以長度為前綴,而不是固定的一個字節。

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