как такие сайты, как https://blockexplorer.com , определяют, является ли ввод (см. поле ввода в заголовке https://blockexplorer.com ) адресом, идентификатором транзакции или идентификатором блока?
Я хочу сам написать что-то подобное на своем локальном компьютере, где я запускаю полный узел и имею доступ к RPC bitcoind. Мне нужно знать, как направить ввод, учитывая, что в одном поле может быть 3 вещи.
Как указано в псевдокоде в ответе amaclin, веб-сайт обозревателя блоков просто проверит, могут ли они найти хэш / txid / адрес в своей базе данных, тогда они узнают, какой это тип ввода.
Вы не можете напрямую выполнить эту проверку с помощью одного RPC-вызова биткойн-ядра, вам придется написать какой-то скрипт для выполнения 3 проверок, чтобы выяснить, какой тип ввода вам дали. Вы можете сначала проверить допустимый хэш блока с помощью getblock
RPC, и если это не удастся, вы узнаете, что это не хэш блока. Затем вам нужно было txindex
включить на своем узле разрешение запрашивать txids с помощью gettransaction
/ getrawtransaction
RPC (поскольку по умолчанию узел индексирует только транзакции, связанные с вашим кошельком). А затем, чтобы проверить, действителен ли его адрес, вы можете использовать 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
}
Различие между 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
}
биткойнблюз
Дэвид Шварц
if ( blockDB.contains ( input ) )
проверку, содержит ли база данных действительных блоков входные данные в виде хэша одного из блоков в базе данных.биткойнблюз