Bestimmen, ob die Eingabe eine Block-ID, Transaktions-ID oder Adresse ist

Wie stellen Websites wie https://blockexplorer.com fest, ob die Eingabe (siehe Eingabefeld in der Kopfzeile von https://blockexplorer.com ) eine Adresse, Transaktions-ID oder Block-ID ist?

Ich möchte selbst etwas Ähnliches auf meinem lokalen Computer schreiben, auf dem ich einen vollständigen Knoten betreibe und Zugriff auf Bitcoin RPC habe. Ich muss wissen, wie man die Eingabe leitet, wenn eine Box 3 Dinge sein kann.

Antworten (3)

Wie im Pseudocode in der Antwort von amaclin beschrieben, würde eine Block-Explorer-Website einfach prüfen, ob sie den Hash/txid/die Adresse in ihrer Datenbank finden können, dann wissen sie, um welche Art von Eingabe es sich handelt.

Sie können diese Prüfung nicht direkt über einen Bitcoin-Core-RPC-Aufruf durchführen, Sie müssten eine Art Skript schreiben, um die 3 Prüfungen durchzuführen, um herauszufinden, welche Art von Eingabe Sie erhalten haben. Sie können zuerst mit dem RPC nach einem gültigen Block-Hash getblocksuchen, und wenn dies fehlschlägt, wissen Sie, dass es kein Block-Hash ist. Als nächstes müssten Sie txindexauf Ihrem Knoten aktiviert haben, damit Sie txids mit den gettransaction/ getrawtransactionRPCs abfragen können (da der Knoten standardmäßig nur Transaktionen indiziert, die sich auf Ihre Brieftasche beziehen). Um dann zu überprüfen, ob es sich um eine gültige Adresse handelt, können Sie den validateaddressRPC-Aufruf verwenden. Wenn all dies fehlgeschlagen ist, wissen Sie, dass die Eingabe ungültig ist.

Es gibt keine Möglichkeit, allein aus einem Hash zu bestimmen, ob es sich um eine Adresse, Transaktions-ID oder Block-ID handelt. Alle drei können jede gültige SHA-256-Nummer sein und umgekehrt.

Um Blockchain-Explorer-Sites zu bestimmen, tun Sie wahrscheinlich so etwas wie den folgenden Pseudocode, wobei blockDB, transactionDB, und addressDBalle bekannten Block-IDs, Transaktions-IDs bzw. Adressen darstellen.

if ( blockDB.contains ( input ) )
{
  // this is block hash
}
else if ( transactionDB.contains ( input ) )
{
  // this is transaction id
}
else if ( addressDB.contains ( input ) )
{
  // this is address
}
else
{
  // error! unknown input
}
Danke, das sieht nach nichts aus, mit dem ich noch vertraut bin. Kann ich diese Befehle über RPC ausführen oder abfragen?
Es ist Pseudo-Code. Was er damit meint, if ( blockDB.contains ( input ) )ist zu testen, ob die Datenbank gültiger Blöcke die Eingabe als Hash eines der Blöcke in der Datenbank enthält.
@DavidSchwartz Danke, können Sie bitte einen Link zur Durchführung dieser Art von Abfrage über RPC bereitstellen?

Die Unterscheidung zwischen Blockhash, txid und Adresse kann anhand ihrer Länge erfolgen, sowohl txid als auch blockhash sind 64 Zeichen lang, wenn also String 2 Nullen als erste zwei Zeichen hat, ist es Bockhash und nicht txid. Hier ist der Beispiel-Javascript-Code:

 if (user_input.length == 64) {

 for (var i = 0; i < 2; i++) {                       

       if (user_input[i] == '0') {
            block_flag = true;
        }
        else {
             block_flag = false;
             break;
        }
  }
  if (block_flag == true) {
      // it's a blockhash
  }
  else{
     //it's a transaction
  }
  }
  else if (user_input.length == 38 || user_input.length === 34) {
     //it's an address
  }
Das ist falsch, viele Transaktionen beginnen mit zwei Nullen und sind keine Block-Hashes. Zwei 0 in Hex sind ein Null-Byte, was ungefähr alle 256 Transaktionen vorkommt - ziemlich häufig. Hier ist zum Beispiel einer aus dem letzten Block, der mit drei Nullen beginnt: 000c5e131451fb96d04eb0b971b7a2334f057a4d1f43a5bee652caf34e8759f0. Die einzige Möglichkeit, zuverlässig zwischen Block-Hash und Transaktions-Hash zu unterscheiden, besteht darin, den Hash in der Blockchain zu suchen.
Blockhash enthält natürlich mehr als zwei Nullen, zwei Nullen sind die Mindestanzahl von Nullen, und es gibt keine einzige Transaktion, die mit zwei Nullen beginnt, es kann keine geben, zeigen Sie mir, ob es eine gibt
Ich habe dir oben buchstäblich nur ein Beispiel gegeben. Warum denken Sie, dass es nicht möglich ist?
Ich habe die blockchain.info nach dieser Transaktion durchsucht, es wurden keine Ergebnisse gefunden