Nachdem ich diese Antwort gelesen habe , in der Peter Wuille darüber spricht, dass ein Knoten nicht wirklich sagen kann, ob er synchronisiert ist oder nicht, habe ich mich gefragt, ob es einen Weg gibt, wie wir feststellen können, dass ein Knoten so synchronisiert ist, wie es nur möglich ist Peers, mit denen es verbunden ist.
Könnten wir einen solchen RPC-Aufruf hinzufügen getsyncstatus
, würde der Knoten seine Peers nach ihren höchsten bekannten Blöcken fragen, und wenn eine Mehrheit (oder ein gewisser Prozentsatz) ihrer Peers sich alle auf die bekannteste Blockhöhe einigen, dann könnte er diese Informationen verwenden, um in der Lage zu sein zu sagen (mit nicht perfekter Zuverlässigkeit), wie synchronisiert der Knoten ist?
Wenn also beispielsweise ein Knoten 8 Peers hat und 7 von ihnen 330448
als beste Blockhöhe zurückgeben und der Client Informationen über block 330448
hat, könnte er einen Statuscode und eine Meldung ausgeben, die signalisiert, dass er auf dem neuesten Stand ist. Wenn die Peers unterschiedliche Antworten geben (was passieren kann, wenn Sie sich mit einem böswilligen Knoten verbinden, der fälschlicherweise seine bekannteste Höhe meldet, ODER wenn andere Peers nicht vollständig synchronisiert sind), könnte es einen Statuscode und eine Meldung geben, die darauf hinweist, dass die Suche durchgeführt wurde nicht schlüssig und sie sollten es später erneut versuchen. Und schließlich, wenn 87,5 % der Knoten sagen 330448
und der Knoten nur bis zu Block synchronisiert ist 1000
, dann kann er einen Statuscode und eine Meldung ausgeben, die darauf hinweisen, dass der Knoten wahrscheinlich nicht ausreichend synchronisiert ist.
Ich denke, dies wäre hauptsächlich nützlich, um festzustellen, ob Server ausreichend mit dem Netzwerk synchronisiert sind, um sie für einige Anwendungen zu verwenden. Die Antworten auf diese Frage beschreiben eine Möglichkeit, um festzustellen, ob Knoten auf dem neuesten Stand sind, aber sie scheinen alle irgendwie hackig zu sein, und ich bin mir nicht sicher, ob sie zuverlässig genug wären.
Der Bitcoin-Client hat eine Möglichkeit zu erkennen, ob er nicht ausreichend synchronisiert ist. Meines Wissens ist es jedoch nicht wirklich auf nette Weise RPC ausgesetzt.
Es heißt IsInitialBlockDownload()
und betrachtet sich selbst als nicht synchronisiert, wenn einer der folgenden Punkte zutrifft:
Sie können aufrufen getblocktemplate
, und wenn IsInitialBlockDownload()
wahr ist, wird es mit einem Fehler von RPC_CLIENT_IN_INITIAL_DOWNLOAD
(oder -10) zurückkommen.
Nehmen wir an, wir entwerfen einen neuen RPC-Aufruf von Grund auf neu. Wie andere Poster angemerkt haben, ist es nicht möglich, dies in Gegenwart von böswilligen Akteuren perfekt zu bestimmen. Welche Faktoren könnten wir messen, um eine fundierte Vermutung anzustellen?
IsInitialBlockDownload()
does verwenden.Nein, das kann man nicht sagen, weil es keine Definition von „synchronisiert sein“ gibt. Sind Sie in dem Moment, in dem ein Miner einen neuen Block findet, immer noch synchronisiert? Wie würdest du wissen?
Was Sie beschreiben, hat keinen Vorteil gegenüber den bereits implementierten Methoden zum Erkennen, ob der Knoten weit zurückliegt (es ist auch bereits implementiert, wie Pieter Wuille in der von Ihnen verlinkten Antwort erklärt, obwohl es nicht in der API verfügbar ist).
Was genau soll mit diesen Informationen erreicht werden? Warum müssen Sie wissen, ob ein Server ausreichend synchronisiert ist? Sie werden viel früher auf die echten Blöcke stoßen, als ein vernünftiger Angreifer sie erzeugen kann.
Nun, Bitcoin ist Open Source, also ist es durchaus möglich, dass Sie versuchen, so etwas selbst zu integrieren. Anstatt jedoch Änderungen am Basiscode vorzunehmen, können Sie möglicherweise ähnliche Funktionen mit den bereits implementierten RPC-Aufrufen erhalten. Im Wesentlichen macht der Bitcoin-Client bereits etwas, was Sie erklären. Wenn Sie sich mit einem Peer verbinden, teilt ein Teil des Handshake-Prozesses den aktuellen Block des anderen; wenn einer höher ist als der andere und gültig ist, beginnt der andere mit dem Herunterladen von dem aktuelleren Peer. Wenn Sie sich die Datei debug.log ansehen, können Sie sehen, dass dies geschieht, zusammen mit einem laufenden "Fortschritts"-Feld, das protokolliert wird und Ihnen den Prozentsatz anzeigt, den Sie heruntergeladen haben.
Für Ihre Idee, wo Sie Informationen zusammenfassen, können Sie jedoch versuchen, den RPC-Aufruf "getpeerinfo" zu verwenden. Sie können die Informationen von dort nehmen und sie beliebig analysieren, ohne einen nativen RPC-Aufruf durchführen zu müssen.
Kann für Sie von Nutzen sein oder auch nicht, aber nur um manchmal zu überprüfen, habe ich ein kleines Skript / eine Webseite, die die aktuelle Blockhöhe von jedem meiner Bitcoin-Knoten erhält - wenn einer von ihnen niedriger als die Mehrheit ist, sind sie nicht synchron . Offensichtlich benötigen Sie Knoten in verschiedenen Netzwerken und Computern, sonst könnte ein Fehler bedeuten, dass alle Knoten nicht synchron sind. Funktioniert jedoch für mich, es ist einfach und verwendet einen vorhandenen RPC-Aufruf.
Morsecoder
getblocktemplate
in diesem Fall geschehen?Nick Odell
Morsecoder
Morsecoder
Nick Odell
Morsecoder
Morsecoder