Determinar si la entrada es un ID de bloque, un ID de transacción o una dirección

¿Cómo determinan los sitios como https://blockexplorer.com si la entrada (consulte el cuadro de entrada en el encabezado de https://blockexplorer.com ) es una dirección, ID de transacción o ID de bloque?

Quiero escribir algo similar en mi máquina local, donde ejecuto un nodo completo y tengo acceso a bitcoind RPC. Necesito saber cómo dirigir la entrada dado que un cuadro puede ser 3 cosas.

Respuestas (3)

Como se describe en el pseudocódigo en la respuesta de amaclin, un sitio web de explorador de bloques simplemente verificaría si pueden encontrar el hash/txid/dirección en su base de datos, luego sabrán qué tipo de entrada es.

No puede realizar esta verificación directamente a través de una llamada RPC del núcleo de bitcoin, tendría que escribir un script de algún tipo para realizar las 3 verificaciones para averiguar qué tipo de entrada recibió. Primero puede verificar si hay un hash de bloque válido usando el getblockRPC, y si eso falla, sabe que no es un hash de bloque. A continuación, tendría que haberlo txindexhabilitado en su nodo para permitirle consultar txids utilizando gettransaction/ getrawtransactionRPC (porque, de manera predeterminada, el nodo solo indexa las transacciones que están relacionadas con su billetera). Y luego, para verificar si es una dirección válida, puede usar la validateaddressllamada RPC. Si todos fallaron, sabrá que la entrada no es válida.

No hay forma de determinar a partir de un hash solo si representa una dirección, ID de transacción o ID de bloque. Los tres podrían ser cualquier número SHA-256 válido y viceversa.

Para determinar los sitios de exploradores de Blockchain, es probable que hagan algo como el siguiente pseudocódigo, donde blockDB, transactionDBy addressDBrepresentan todos los ID de bloque conocidos, ID de transacciones y direcciones, respectivamente.

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
}
Gracias, esto no se parece a nada con lo que esté familiarizado, ¿puedo ejecutar estos comandos o consultarlos a través de RPC?
Es pseudocódigo. Lo que quiere decir if ( blockDB.contains ( input ) )es probar si la base de datos de bloques válidos contiene la entrada como el hash de uno de los bloques en la base de datos.
@DavidSchwartz Gracias, ¿puede proporcionar un enlace sobre cómo realizar este tipo de consulta a través de RPC?

La diferenciación entre blockhash, txid y dirección se puede hacer en función de su longitud, tanto txid como blockhash tienen 64 caracteres, por lo que si la cadena tiene 2 ceros como dos primeros caracteres, es bockhash y no txid. Aquí está el código javascript de muestra:

 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
  }
Esto es incorrecto, muchas transacciones comienzan con dos 0 y no son hashes de bloque. Dos 0 en hexadecimal es un byte nulo, lo que ocurre aproximadamente una vez cada 256 transacciones, algo bastante común. Por ejemplo, aquí hay uno del bloque más reciente que comienza con tres 0: 000c5e131451fb96d04eb0b971b7a2334f057a4d1f43a5bee652caf34e8759f0. La única forma de diferenciar de manera confiable entre el hash de bloque y el hash de transacción es buscar el hash en la cadena de bloques.
blockhash, por supuesto, contiene más de dos ceros, dos ceros es el número mínimo de zereos, y no hay una sola transacción que comience con dos ceros, no puede haber, muéstrenme si hay
Literalmente te acabo de dar un ejemplo arriba. ¿Por qué crees que no es posible?
busqué en blockchain.info esa transacción, no se encontraron resultados