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.
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 getblock
suchen, und wenn dies fehlschlägt, wissen Sie, dass es kein Block-Hash ist. Als nächstes müssten Sie txindex
auf Ihrem Knoten aktiviert haben, damit Sie txids mit den gettransaction
/ getrawtransaction
RPCs 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 validateaddress
RPC-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 addressDB
alle 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
}
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
}
BitcoinBLues
David Schwarz
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.BitcoinBLues