Feldgröße und Wertebereich von chainId (EIP-155)

EIP-155 hat eine Liste von Ketten-IDs definiert, z. B. Hauptnetz ist 1, Ropsten ist 2. Ich scheine keine Definition über den angenommenen Wertebereich und die Datengröße finden zu können.

Zitieren der Gelbbuchregel (287)

Es wird angenommen, dass v entweder die „Wiederherstellungskennung“ oder die „Kettenkennung verdoppelt plus 35 oder 36“ ist. Die Wiederherstellungskennung ist ein 1-Byte-Wert

Der Text sagt, wenn es sich um eine Wiederherstellungskennung handelt, ist sie in einem Byte codiert. Es wird nicht über die Größe für erwähnt chain identifier doubled plus.

Für den chain identifier doubled plusFall, dass ein Byte nicht ausreicht, scheint EIP-155 1337als Wert für private Chains von Geth aufgeführt zu sein. Es scheint also sicher zu sein, dass dieses Feld (dh Tw) länger als ein Byte sein kann. Wenn das der Fall ist, sollte es nicht mit einem Längenpräfix codiert werden?

Ist es neben dem Wert 1337möglich, dass andere Netzwerke noch größere, längere ChainId-Einstellungen haben?

Antworten (2)

An verschiedenen Stellen im Geth-Code sieht es so aus, als wäre es als BigInt. (Die tatsächliche Obergrenze ist architekturabhängig .)

Zum Beispiel im config.go:

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

Ich würde davon ausgehen, dass die anderen Clients es in ähnlicher Größe und Genauigkeit implementieren.

Die Antwort von Richard Horrocks ist richtig. Das Feld hat keine Größen- oder Wertbegrenzung (Teil von nicht-negativ, siehe Geth-Code ). Ich habe auch eine Testtransaktion in einem privaten Netzwerk mit einer beliebigen network_id von durchgeführt 4901. Der Versuch geht wie folgt.

> eth.sendTransaction({von: '0x90f8bf6a479f320ead074411a4b0e7944ea8c9c1', bis: '0xad322de69695859fc84f32d0f42c3802fe101843', Wert: 8000000000})

Der ausgegebene Transaktions-Hash ist

"0xa0f67799bca1f633f66567455aaeff0728cb72c78d3fff9af0875d4918356c8c"

Als nächstes erhalten wir die rohen Transaktionsbytes

>eth.getRawTransaction('0xa0f67799bca1f633f66567455aaeff0728cb72c78d3fff9af0875d4918356c8c')

Das Ergebnis ist

"0xf86e820678850430e2340083015f9094ad322de69695859fc84f32d0f42c3802fe1018438501dcd650008082266ea027caed8171ad1857ff259554614152cda78949adda001e24472f84840bca5cd6a04a5f557baae23ce45c97b71363ea8da6740ac2652bd02b7f94b18cae62d7905a"

String manuell parsen: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)

Aus obigem Beispiel

  • Ja, Länge und Wert sind unbegrenzt
  • Ja, dem Feld wird die Länge vorangestellt und nicht ein festes Ein-Byte.