Die Verbindung zwischen Peers findet nie auf einer benutzerdefinierten Blockchain statt [Duplikat]

Meine App verbindet und nutzt dieselbe Blokchain auf jeder Instanz, sie verwendet dieselbe Genesis.json- und Netzwerk-ID.

Entstehung: https://github.com/AugustoL/OpenContent/blob/master/genesis.json

Web3-Dienst, der sich mit derselben Netzwerk-ID verbindet: https://github.com/AugustoL/OpenContent/blob/master/js/services/web3.js

Wenn ich es auf zwei verschiedenen Computern ausführe, wird die vorhandene Blockchain nicht erkannt. SO beginnt es, zwei verschiedene Blockchains mit derselben Genese und Netzwerk-ID abzubauen: S

Was ist der Fehler? Was fehlt mir? Ich habe viel gelesen und es soll funktionieren.

welchen Befehl startest du auf der CLI?
Etwas wie: geth --networkid "1998165215114019841" --genesis ./genesis.json --datadir ./blockchain --rpc --verbosity=4 --rpcaddr 127.0.0.1 --rpcport 8545 --rpccorsdomain=" localhost:80 " --rpcapi "admin,eth,miner,net,personal,web3" --nat "any" --extradata "OpenContent 0.1" Sie können es hier ansehen: github.com/AugustoL/OpenContent/blob/master/js/ services/web3.js
ah ok, wollte nur sicher gehen, dass --nodiscoverdas nicht eingestellt ist. Hmm, ich vermute, Sie haben auch das Kapitel über „Einrichten mehrerer Knoten“ auf github.com/ethereum/go-ethereum/wiki/… und den Teil über „häufige Probleme mit der Verbindung“ auf github.com/ethereum/go-ethereum/wiki gelesen /Verbinde-mit-dem-Netzwerk ?
Ja, ich habe es bereits gelesen und versucht, die Knoten manuell hinzuzufügen, aber es hat nicht funktioniert: S
Bitte stellen Sie sicher, dass keine Firewall UDP/TCP-Verbindungen auf Port blockiert 30303.
@PéterSzilágyi , sie sind nicht blockiert.

Antworten (1)

Der Grund

Der Grund, warum sich Ihre beiden gethInstanzen auf den zwei verschiedenen Computern nicht finden können, ist, dass sie nicht wissen, wo sie mit der Suche nach einander beginnen sollen.

Hinweis: Ich habe den öffentlichen Schlüssel des Knotens zum leichteren Lesen in dieser Antwort gekürzt. Zum Beispiel
"a979fb575495b8d6db44f750317d0f4622bf4c2aa3365d6af7c284339968eef29b69ad0dce72a4d8db5ebb4968de0e3bec910127f134779fbcb0cb6d3331163c"wurde zu verkürzt "a979....163c". Beim Einrichten Ihres Netzwerks müssen Sie die vollständigen öffentlichen Schlüssel verwenden.

In der öffentlichen Mainnet-Blockchain versucht jeder Peer beim Start, sich mit den „Bootnodes“ zu verbinden, um eine anfängliche Liste von Peers zu erhalten, mit denen er sich verbinden kann. Die Adresse dieser Bootnodes ist wie unten gezeigt in den Zeilen 71-78 von eth/backend.go fest codiert :

defaultBootNodes = []*discover.Node{
    // ETH/DEV Go Bootnodes
    discover.MustParseNode("enode://a979....163c@52.16.188.185:30303"), // IE
    discover.MustParseNode("enode://de47....c786@54.94.239.50:30303"),  // BR
    discover.MustParseNode("enode://1118....5082@52.74.57.123:30303"),  // SG
    // ETH/DEV cpp-ethereum (poc-9.ethdev.com)
    discover.MustParseNode("enode://979b....37f9@5.1.83.226:30303"),
}

Sobald sich ein Knoten mit dem Bootnode verbindet, erhält er eine Liste mit Adressen für potenzielle Peers, mit denen er sich verbinden kann, und er versucht, sich mit diesen Peers zu verbinden.

In Ihrem privaten Netzwerk gibt es keinen solchen Ausgangspunkt.



Die Lösung

In Ihrem privaten Netzwerk gethwissen Ihre Instanzen nicht, wo sie mit der Suche beginnen sollen, und Sie müssen ihnen einige Hinweise geben. Dazu gibt es drei Möglichkeiten: Verwenden Sie den --bootnodesBefehlszeilenparameter, fügen Sie eine static-nodes.jsonzu Ihrem Datenverzeichnis hinzu oder fügen Sie eine trusted-nodes.jsonzu Ihrem Datenverzeichnis hinzu.

Führen Sie gethauf jedem Ihrer Computer aus und geben Sie Folgendes admin.nodeInfoin die Befehlszeile ein:

> admin.nodeInfo
{
  enode: "enode://d9d9....30d9@[::]:30301?discport=0",
  id: "d9d9....30d9",
  ip: "::",
  listenAddr: "[::]:30301",
  name: "Geth/v1.3.6/linux/go1.5.1",
  ports: {
    discovery: 0,
    listener: 30301
  },
  ...
}

Was Sie tun müssen, ist, die Enode-Informationen für Ihre beiden Computer zu erhalten. Ersetzen Sie die [::]in den enode-Informationen durch die IP-Adresse Ihrer beiden Computer und entfernen Sie die, ?discport=0falls vorhanden. Ihre Enode-Informationen für jeden Computer sollten dann wie folgt aussehen:

  • Computer 1-Knoten:enode://d9d9....30d9@192.168.1.152:30303
  • Computer 2-Knoten:enode://1212....3434@192.168.1.253:30303


Lösung 1 - Die --bootnodesLösung

Bei dieser ersten --bootnodesLösung müssen Sie den Bootknoten der Instanz eines Computers für die gethInstanz des anderen Computers angeben geth. Auf Computer 1 beginnen Sie also mit dem gethHinzufügen des folgenden Parameters:

--bootnodes "enode://1212....3434@192.168.1.253:30303"


Lösung 2 - Die static-nodes.jsonLösung

Diese zweite Lösung besteht darin, die Datei static-nodes.jsonin Ihrer zu erstellen --datadir, daher sollten Dateiname und Pfad in Ihrem Fall ./blockchain/static-nodes.json. Auf Computer Nr. 1 sollte diese Datei die Enode-Informationen von Computer Nr. 2 enthalten und umgekehrt. Alternativ erstellen Sie einfach eine static-nodes.jsonmit den Enode-Informationen beider Computer Nr. 1 und Nr. 2 und kopieren diese static-nodes.jsonauf die --datadirbeider Computer. Der Inhalt dieser Datei sollte wie folgt aussehen:

[
  "enode://d9d9....30d9@192.168.1.152:30303",
  "enode://1212....3434@192.168.1.253:30303"
]


Lösung 3 - Die trusted-nodes.jsonLösung

Wie Lösung #2, aber verwenden Sie den Dateinamen trusted-nodes.jsonanstelle von static-nodes.json. Der Unterschied besteht hier darin, dass vertrauenswürdige Knoten nicht zur Anzahl der Peer-Knoten hinzugefügt werden, wenn das --maxpeersLimit erreicht ist.



Verwenden --maxpeersund nicht verwenden--nodiscover

Möglicherweise müssen Sie einen Wert ungleich Null angeben --maxpeers, damit dies funktioniert. Verwenden Sie beispielsweise den Parameter:

geth ... --maxpeers 2 ...

Und verwenden Sie es nicht --nodiscoverin Ihrer gethBefehlszeile, da dies die Peer-Erkennung deaktiviert.



Verwandte Fragen

Hier sind einige verwandte Fragen, die Ihnen bei der Lösung Ihrer Verbindungsprobleme helfen können:

Schön erklärt
Sie sollten erwägen, die Frage zu schließen duplicate, da es keinen Sinn macht, eine bereits beantwortete Frage zu beantworten, wenn Sie Ähnlichkeiten feststellen. Und die andere Frage wird von Ihnen auch +1 dafür beantwortet.
Diese Antwort ist klarer, da ich die Probleme jetzt etwas besser verstehe als bei der Beantwortung der vorherigen Frage. Soll ich die beiden vorherigen Fragen als Duplikate dieser Frage markieren?
Nicht notwendig, ich habe dies als Duplikat markiert, es wird bald geschlossen. Übrigens, du machst hier einen tollen Job, Kumpel. 2K+ Wiederholungen in 2 Wochen; beeindruckend.
Vielen Dank. Ich recherchiere über die Ethereum-Blockchain und Smart Contracts, und die Fragen, die hier gestellt werden, helfen mir, das Ökosystem zu erkunden. Ich dokumentiere einige dieser Probleme, damit ich in Zukunft darauf verweisen kann. Und diese Blockchain ist für mich wie Lego Mindstorm, verglichen mit regulärer Programmierung, die reguläres Lego ist. Viele Teile zum Erkunden und Sehen, wie sie zusammenpassen.
Zu viel Enthusiasmus :) Du kannst hier der nächste John Skeet sein.
Das ist mein Aufschiebemechanismus. Ich soll viele andere Dinge tun, die ich nicht tun möchte, also verliere ich mich nur in meinen Hobbys.