Im heutigen Artikel werden wir einige frühere Diskussionen zum Thema Netzwerkoptimierung überprüfen, die zu Verbesserungen führten, die jetzt den Kern der neuen indexbasierten Block-Synchronisationsmethode bilden. Bei dem Ansatz können Knoten fehlende Blockdaten in einer einzelnen, kompakten Nachricht anfordern, die einen Bereich gewünschter Blockindizes enthält.
Vorschläge zur Verbesserung des Netzwerkprotokolls von Neo reichen bis ins Jahr 2018 zurück, wobei verschiedene Ineffizienzen festgestellt wurden
In einer Reihe von Vorschlägen des Community-Entwicklers Kevaundray wurden mehrere dieser Probleme festgestellt, die sich auf die Verbesserung der Bitcoin Gemini Antwortzeiten auf Knotenabbrüche und die Verringerung von Verzögerungen bei der Blocksynchronisation konzentrierten.
Diese Vorschläge führen zu implementierten Verbesserungen, wie dem Hinzufügen von Ping / Pong-Heartbeat-Nachrichten zur Überprüfung der Knotenhöhe, inspirieren aber auch zu einer anderen Lösung. Ein Vorschlag von COZs Neo-Python-Betreuer Ixje im Dezember 2018 lieferte das erste Beispiel für eine indexbasierte Synchronisation. In dem Vorschlag stellte Ixje die aktuellen Ineffizienzen und semantische Probleme mit dem getblocks Befehl ein :
„Der aktuelle Befehl getblocks ist ineffizient und hat auch einen irreführenden Namen. Der Name deutet darauf hin, dass Sie Blöcke erhalten . In Wirklichkeit erhalten Sie Hashes (über eine Inv- Nachricht). Sie packen dann im Grunde die gleichen Informationen dieser Inv- Nachricht neu, aber jetzt mit dem Befehl getdata , um die Blocknachrichten endgültig zu empfangen. “
Ixje schlug einen effizienteren Befehl vor, getfullblocks , der den Netzwerkverkehr und die Geschäftslogik zum Abrufen von Blöcken reduzieren würde, indem der Prozess in einen zweistufigen Prozess verschoben wird. Anstatt Header anzufordern, Header zu empfangen und dann Hashes zum Anfordern und Abrufen von Blockdaten zu verwenden, könnten Knoten die gewünschten Blöcke anfordern und die entsprechenden Daten direkt empfangen.
Um die Lösung noch einen Schritt weiter zu gehen, wurde hier zunächst der Vorschlag zur Verwendung von Blockindizes veröffentlicht, der die Vorteile einer verringerten Nachrichtengröße und der Beseitigung der Notwendigkeit bietet, Hashes (einschließlich des Genesis-Block-Hash) zu kennen, um mit dem Blockabruf zu beginnen .
Indexsynchronisation
Die von Ixje vorgeschlagene Methode verzichtet auf den in der Blockchain-Branche allgegenwärtigen Header-First-Ansatz, den wir im vorherigen Artikel erörtert haben. Durch die Nutzung der Ungabelbarkeit von Neo, die durch den dBFT-Konsensmechanismus bereitgestellt wird, können Knoten im Netzwerk Blockdaten nur nach Index anfordern.
Dies liegt daran, dass dBFT sicherstellt, dass jeder Knoten dieselbe Ansicht der Blockchain wie die Konsensknoten hat, sodass sichergestellt werden kann, dass die Daten an jedem Blockindex immer identisch sind. Falls Knoten falsche Blockdaten oder einen falschen Status haben, können sie schnell auf das Problem aufmerksam werden, indem sie auf den signierten Status verweisen, der über P2P-Nachrichten gemeinsam genutzt wird.
In Verbindung mit den Vereinfachungen in der Blockabruflogik bot der Vorschlag theoretisch signifikante Verbesserungen des Synchronisationsprozesses. Trotzdem wurden die Diskussionen nach der Ankündigung von Neo3 unterbrochen. Später im Jahr, als das Kernentwicklerteam begann, die im Rahmen von Neo3 zu implementierenden Änderungen zu bewerten, traten erneut Ineffizienzen auf, die sich aus dem Ansatz der Header-First-Synchronisation ergaben.