Определение того, является ли ввод идентификатором блока, идентификатором транзакции или адресом

как такие сайты, как https://blockexplorer.com , определяют, является ли ввод (см. поле ввода в заголовке https://blockexplorer.com ) адресом, идентификатором транзакции или идентификатором блока?

Я хочу сам написать что-то подобное на своем локальном компьютере, где я запускаю полный узел и имею доступ к RPC bitcoind. Мне нужно знать, как направить ввод, учитывая, что в одном поле может быть 3 вещи.

Ответы (3)

Как указано в псевдокоде в ответе amaclin, веб-сайт обозревателя блоков просто проверит, могут ли они найти хэш / txid / адрес в своей базе данных, тогда они узнают, какой это тип ввода.

Вы не можете напрямую выполнить эту проверку с помощью одного RPC-вызова биткойн-ядра, вам придется написать какой-то скрипт для выполнения 3 проверок, чтобы выяснить, какой тип ввода вам дали. Вы можете сначала проверить допустимый хэш блока с помощью getblockRPC, и если это не удастся, вы узнаете, что это не хэш блока. Затем вам нужно было txindexвключить на своем узле разрешение запрашивать txids с помощью gettransaction/ getrawtransactionRPC (поскольку по умолчанию узел индексирует только транзакции, связанные с вашим кошельком). А затем, чтобы проверить, действителен ли его адрес, вы можете использовать validateaddressвызов RPC. Если все это не удалось, вы знаете, что ввод недействителен.

Невозможно определить только по хешу, представляет ли он адрес, идентификатор транзакции или идентификатор блока. Все три могут быть любым допустимым номером SHA-256, и наоборот.

Чтобы определить, сайты Blockchain Explorer, вероятно, используют следующий псевдокод, где blockDB, transactionDBи addressDBпредставляют все известные идентификаторы блоков, идентификаторы транзакций и адреса соответственно.

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
}
Спасибо, это не похоже ни на что, с чем я еще не знаком, эти команды я могу выполнять или запрашивать через RPC?
Это псевдокод. Под этим он подразумевает if ( blockDB.contains ( input ) )проверку, содержит ли база данных действительных блоков входные данные в виде хэша одного из блоков в базе данных.
@DavidSchwartz Спасибо, не могли бы вы дать ссылку на то, как выполнить такой запрос через RPC?

Различие между blockhash, txid и адресом может быть сделано на основе их длины, и txid, и blockhash имеют длину 64 символа, поэтому, если строка имеет 2 нуля в качестве первых двух символов, это bockhash, а не txid. Вот пример кода javascript:

 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
  }
Это неправильно, многие транзакции начинаются с двух нулей и не являются хэшами блоков. Два нуля в шестнадцатеричном формате — это один нулевой байт, что происходит примерно раз в 256 транзакций — довольно часто. Например, вот один из последнего блока, который начинается с трех нулей: 000c5e131451fb96d04eb0b971b7a2334f057a4d1f43a5bee652caf34e8759f0. Единственный способ надежно отличить хеш блока от хэша транзакции — это найти хэш в блокчейне.
blockhash конечно содержит более двух нулей, два нуля это минимальное количество нулей, и нет ни одной транзакции, которая начинается с двух нулей, не может быть, покажите мне, если есть
Я буквально только что привел вам пример выше. Почему вы думаете, что это невозможно?
Я искал эту транзакцию на blockchain.info, но ничего не нашел.