chainId 的欄位大小和取值範圍(EIP-155)
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)
從上面的例子
- 是的,長度和價值都是無限的
- 是的,該欄位以長度為前綴,而不是固定的一個字節。