Ich habe ein privates Ethereum-Netzwerk mit einer benutzerdefinierten ChainId (z. B. 67890) eingerichtet, die im Konfigurationsteil der Datei genesis.json angegeben ist, habe Genesis.json gestartet und das private Netz zum Laufen gebracht. Dann sind mir jedoch einige seltsame Dinge aufgefallen, wie z.
Also habe ich einige Tests durchgeführt und herausgefunden, dass beim Ausführen von web3.eth.net.getNetworkType() privatenet zurückgegeben wird, aber wenn ich web3.eth.net.getId() ausführe, wird 1 zurückgegeben. Und nach einigem Fummeln fand ich es heraus dass ich eine --networkid 67890 im geth-Befehlszeilenparameter für web3.eth.net.getId() hinzufügen muss, um den korrekten Wert von 67890 zurückzugeben.
Meine Frage ist also, was ist der Unterschied zwischen der Angabe der networkid in der Geth-Befehlszeile und der Angabe der chainId in genesis.json? Ich dachte, die Netzwerk-ID und die Ketten-ID sind ein und dasselbe, und es scheint, dass web3 den Wert der Netzwerk-ID für den Standardwert der Transaktions-Ketten-ID verwendet, aber irgendwie, wenn ich geth ohne expliziten Netzwerk-ID-Parameter starte, ignoriert es die Ketten-ID-Konfiguration und Verwenden Sie weiterhin 1 als Standard, was zu einer anderen Netzwerk-ID als der Chain-ID führt.
Ist es also für eine Ethereum-Blockchain wirklich sinnvoll, dass sich die Netzwerk-ID und die Ketten-ID voneinander unterscheiden, oder handelt es sich um eine Art Fehler?
Netzwerk-ID und Ketten-ID sind dasselbe
NetworkId
Sie können in eth/config.go
& bearbeiten params/config.go
und dieses Problem für immer beseitigen, Sie müssen es nicht network id
mehr in der Befehlszeile angeben.
Ethereum geth
hat den Wert 1
in den Dateien, die ich Ihnen gesagt habe, fest codiert, deshalb haben Sie diese Probleme.
Das chain id
ist jetzt Teil der Transaktion als Ergebnis des Ethereum Improvement Proposal (EIP) #155, daher invalid sender
wird das angezeigt, weil chain id
es anders ist. Sie können dies mit EIP155BlockNum deaktivieren, aber Sie wären anfällig für Replay-Angriffe, wenn Sie mehrere Netzwerke verwenden, z. B. ein Testnet.
chain id
ist nicht Teil des Hashs des Blocks, daher ist es wirklich nutzlos, ihn in der Genesis-Datei anzugeben. Stattdessen müssen Sie die ChainID im Quellcode oder mithilfe von Befehlszeilenparametern angeben.
chainID
Feld in den Genesis-Block einfügen, aber die Blockchain-Datenbank speichert es nicht. chainID
ist nur ein Parameter des geth
Quellcodes, nicht der Datenbank. Das ist, was ich meine.chainID
zur Transaction
s-Tabelle hinzugefügt, indem EIP155-Vorschlag zu hinzugefügt wurde geth
. Dies ist die einzige Speicherung chainID
in der Datenbank.chainID
admin
in die Konsole ein, im protocols
Abschnitt können Sie das sehen network
(das ist das chainID
) und überprüfen, ob es richtig eingestellt istgeth
Ihre genesis.json und speichert die ChainID intern in Parametern. Beim nächsten Start geth
liest es die ChainID von dort. Aber chainID
es ist nicht Teil des Block-Hashes, also ist es nicht kryptografisch versiegelt, wenn jemand Ihre Datenbank kopiert und ändert chainID
, wird alles gut mit einem anderen chainID
funktionieren, es sei denn, EIP155 ist aktiviert. Wenn EIP155 aktiviert ist , erhalten geth
Sie invalid sender
bei der Verarbeitung der ersten EIP155-aktivierten Transaktion
einen FehlerchainId
In der ersten Kette werden Sie in der Genesis-Datei angeben . In der zweiten Kette löschen Sie diese Zeile und initialisieren sie, ohne die ChainID in der Genesis anzugeben. Sie werden feststellen, dass beide Blockchains genau gleich sind.
Richard Horrocks