Bitcoin Forum

Local => Кодеры => Topic started by: epros on December 25, 2013, 02:35:13 PM



Title: Как получить спис. транз. с адресами?
Post by: epros on December 25, 2013, 02:35:13 PM
Смотрю описание стандартного API (https://en.bitcoin.it/wiki/Api) и не могу понять: как (и можно ли) получить от bitcoind список n последних транзакций с адресами корреспондентов? Функция  listtransactions возвращает данные с собственными адресами, причем не с теми, которые реально являются одним из from address или to address транзакции. А где же адрес отправителя/получателя с другой стороны? Функция gettransaction тоже возвращает только свой адрес. Функция getrawtransaction говорит: "No information available about transaction" - и это по транзакции, с которой мне пришли реальные деньги и детали которой можно посмотреть на blockexplorer.com...

Не понимаю я логики этого продукта...


Title: Re: Как получить список транзакций с адресамl
Post by: icreator on December 25, 2013, 02:36:43 PM
getrawtransaction


Title: Re: Как получить список транзакций с адресамl
Post by: epros on December 25, 2013, 02:37:45 PM
getrawtransaction
Почему же она мне говорит, что не знает этой транзакции?


Title: Re: Как получить спис. транз. с адресами?
Post by: icreator on December 25, 2013, 03:34:36 PM
надо пересобрать базу данных - с ключом переиндексации

если рав-транз пишет ошибку - мол нету такой - надо переиндексировать:
"C:\Program Files (x86)\CopperLark\CopperLark.exe"  -reindex -txindex


Title: Re: Как получить спис. транз. с адресами?
Post by: epros on December 25, 2013, 03:38:50 PM
надо пересобрать базу данных - с ключом переиндексации

если рав-транз пишет ошибку - мол нету такой - надо переиндексировать:
"C:\Program Files (x86)\CopperLark\CopperLark.exe"  -reindex -txindex

Что такое за CopperLark? У меня демон bitcoind под линуксом, запущен был как раз с ключом -reindex. Процесс "реиндекса" (или чего-то там ещё - до тех пор, пока счётчик блоков не достигнет текущих значений) занимает не меньше суток :(


Title: Re: Как получить спис. транз. с адресами?
Post by: icreator on December 25, 2013, 03:46:18 PM
да это крипта русская хилая
укажи свой биткоин там - только 2 ключа разом давай как написано


Title: Re: Как получить спис. транз. с адресами?
Post by: epros on December 25, 2013, 06:25:45 PM
да это крипта русская хилая
укажи свой биткоин там - только 2 ключа разом давай как написано
Не понял. Я с биткоином работаю. А это, вроде, другая сеть?


Title: Re: Как получить спис. транз. с адресами?
Post by: Valle on December 25, 2013, 08:16:23 PM
Для корректной работы getrawtransaction bitcoin-qt нужно запустить с параметром '-txindex 1'


Title: Re: Как получить спис. транз. с адресами?
Post by: epros on December 26, 2013, 03:53:11 PM
Для корректной работы getrawtransaction bitcoin-qt нужно запустить с параметром '-txindex 1'
ОК, я запустил демона с ключом -txindex и получил ответ на getrawtransaction, декодировал его. В разделе "vin" заполнен txid исходной транзакции и "scriptSig". А где адрес отправителя денег-то взять?


Title: Re: Как получить спис. транз. с адресами?
Post by: Valle on December 26, 2013, 04:31:13 PM
в этой транзакции берешь индекс выхода предыдущей транзакции - в этом выходе в скрипте записан получатель, т.е. отправитель для первой транзакции.


Title: Re: Как получить спис. транз. с адресами?
Post by: epros on December 26, 2013, 04:50:21 PM
в этой транзакции берешь индекс выхода предыдущей транзакции - в этом выходе в скрипте записан получатель, т.е. отправитель для первой транзакции.
Мда-аа... А что, без всех этих операций по вырезанию аппендицита через задний проход, т.е. просто запросить и получить от биткоина в ответ адрес отправителя денег - никак нельзя?


Title: Re: Как получить спис. транз. с адресами?
Post by: Valle on December 26, 2013, 04:55:39 PM
Можно. Только для этого нужно придумать свой коин, в котором в каждой транзакции будет записан адрес отправителя. Эта информация, правда, будет избыточна.


Title: Re: Как получить спис. транз. с адресами?
Post by: epros on December 26, 2013, 05:09:23 PM
Можно. Только для этого нужно придумать свой коин, в котором в каждой транзакции будет записан адрес отправителя. Эта информация, правда, будет избыточна.
Идея системы, когда можно иметь 500 адресов и отправить деньги по копейке сразу с них со всех, конечно, весьма любопытна. Кто-то, видно с перепою, решил, что таким образом якобы обеспечивается какая-то "анонимность". Хотя на самом деле все цепочки транзакций выложены в открытой сети и легко прослеживаются. А вот, если что не так, то на какой из этих адресов мне деньги возвращать? Вот в чём вопрос...


Title: Re: Как получить спис. транз. с адресами?
Post by: Valle on December 26, 2013, 05:58:03 PM
Штука в том, что отправитель может быть не адрес, а, к примеру, скрипт или вообще аноним.


Title: Re: Как получить спис. транз. с адресами?
Post by: epros on December 27, 2013, 08:43:52 AM
Штука в том, что отправитель может быть не адрес, а, к примеру, скрипт или вообще аноним.
Что это значит? Что в той транзакции, которая указана в vin, в соответствующем vout вообще не будет указан никакой адрес? :o


Title: Re: Как получить спис. транз. с адресами?
Post by: Valle on December 27, 2013, 05:31:53 PM
ну да, там может быть какой-нибудь другой ребус (скрипт) или это может быть новые коины, тогда входов вообще не будет. Могут быть выходы, которые может потратить вообще кто-угодно. Перевод с адреса на адрес требуя подпись этого адреса - это всего-лишь одна возможность использования.


Title: Re: Как получить спис. транз. с адресами?
Post by: roleg on December 27, 2013, 06:05:05 PM
берешь с txid asm вторую часть после пробела, это будет public key и...
Code:
function get_address($publickey) {
// step 1

$step1=hexStringToByteString($publickey);

// step 2

$step2=hash("sha256",$step1);


// step 3

$step3=hash('ripemd160',hexStringToByteString($step2));

// step 4

$step4="00".$step3;

// step 5

$step5=hash("sha256",hexStringToByteString($step4));

// step 6

$step6=hash("sha256",hexStringToByteString($step5));

// step 7

$checksum=substr($step6,0,8);

// step 8

$step8=$step4.$checksum;

// step 9
// base conversion is from hex to base58 via decimal.
// Leading hex zero converts to 1 in base58 but it is dropped
// in the intermediate decimal stage.  Simply added back manually.

$step9=bc_base58_encode(bc_hexdec($step8));
return $step9;
}

function hexStringToByteString($hexString){
    $len=strlen($hexString);

    $byteString="";
    for ($i=0;$i<$len;$i=$i+2){
        $charnum=hexdec(substr($hexString,$i,2));
        $byteString.=chr($charnum);
    }

return $byteString;
}


// BCmath version for huge numbers
function bc_arb_encode($num, $basestr) {
    if( ! function_exists('bcadd') ) {
        Throw new Exception('You need the BCmath extension.');
    }

    $base = strlen($basestr);
    $rep = '';

    while( true ){
        if( strlen($num) < 2 ) {
            if( intval($num) <= 0 ) {
                break;
            }
        }
        $rem = bcmod($num, $base);
        $rep = $basestr[intval($rem)] . $rep;
        $num = bcdiv(bcsub($num, $rem), $base);
    }
    return $rep;
}

function bc_arb_decode($num, $basestr) {
    if( ! function_exists('bcadd') ) {
        Throw new Exception('You need the BCmath extension.');
    }

    $base = strlen($basestr);
    $dec = '0';

    $num_arr = str_split((string)$num);
    $cnt = strlen($num);
    for($i=0; $i < $cnt; $i++) {
        $pos = strpos($basestr, $num_arr[$i]);
        if( $pos === false ) {
            Throw new Exception(sprintf('Unknown character %s at offset %d', $num_arr[$i], $i));
        }
        $dec = bcadd(bcmul($dec, $base), $pos);
    }
    return $dec;
}


// base 58 alias
function bc_base58_encode($num) {
    return bc_arb_encode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}
function bc_base58_decode($num) {
    return bc_arb_decode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}

//hexdec with BCmath
function bc_hexdec($num) {
    return bc_arb_decode(strtolower($num), '0123456789abcdef');
}
function bc_dechex($num) {
    return bc_arb_encode($num, '0123456789abcdef');
}


Title: Re: Как получить спис. транз. с адресами?
Post by: Valle on December 28, 2013, 06:31:39 AM
кстати да )


Title: Re: Как получить спис. транз. с адресами?
Post by: epros on January 03, 2014, 08:11:48 AM
это может быть новые коины, тогда входов вообще не будет.
Ну, полагаю, что если я не участвую в майнинге, то этот вариант мне не грозит. ;)

ну да, там может быть какой-нибудь другой ребус (скрипт)
Вот это интересный вариант. Как это так: какой-то "скрипт" в том месте, где должен быть адрес?

Могут быть выходы, которые может потратить вообще кто-угодно. Перевод с адреса на адрес требуя подпись этого адреса - это всего-лишь одна возможность использования.
Это тоже вариант инетересный. Разве в алгоритме предусмотрена возможность оправить деньги "любому получателю"? Где бы про это почитать подробнее?


Title: Re: Как получить спис. транз. с адресами?
Post by: epros on January 03, 2014, 08:17:26 AM
roleg, спасибо. Наверное этот вариант - самый правильный. Но я уже реализовал вариант с доставанием первого адреса из соответствующего vout транзакции, указанной в первом vin...


Title: Re: Как получить спис. транз. с адресами?
Post by: Valle on January 04, 2014, 01:55:46 AM
это может быть новые коины, тогда входов вообще не будет.
Ну, полагаю, что если я не участвую в майнинге, то этот вариант мне не грозит. ;)

ну да, там может быть какой-нибудь другой ребус (скрипт)
Вот это интересный вариант. Как это так: какой-то "скрипт" в том месте, где должен быть адрес?

Могут быть выходы, которые может потратить вообще кто-угодно. Перевод с адреса на адрес требуя подпись этого адреса - это всего-лишь одна возможность использования.
Это тоже вариант инетересный. Разве в алгоритме предусмотрена возможность оправить деньги "любому получателю"? Где бы про это почитать подробнее?
https://en.bitcoin.it/wiki/Script


Title: Re: Как получить спис. транз. с адресами?
Post by: icreator on August 12, 2014, 07:21:05 PM
берешь с txid asm вторую часть после пробела, это будет public key и...
Code:
function get_address($publickey) {
// step 1

$step1=hexStringToByteString($publickey);

// step 2

$step2=hash("sha256",$step1);


// step 3

$step3=hash('ripemd160',hexStringToByteString($step2));

// step 4

$step4="00".$step3;

// step 5

$step5=hash("sha256",hexStringToByteString($step4));

// step 6

$step6=hash("sha256",hexStringToByteString($step5));

// step 7

$checksum=substr($step6,0,8);

// step 8

$step8=$step4.$checksum;

// step 9
// base conversion is from hex to base58 via decimal.
// Leading hex zero converts to 1 in base58 but it is dropped
// in the intermediate decimal stage.  Simply added back manually.

$step9=bc_base58_encode(bc_hexdec($step8));
return $step9;
}

function hexStringToByteString($hexString){
    $len=strlen($hexString);

    $byteString="";
    for ($i=0;$i<$len;$i=$i+2){
        $charnum=hexdec(substr($hexString,$i,2));
        $byteString.=chr($charnum);
    }

return $byteString;
}


// BCmath version for huge numbers
function bc_arb_encode($num, $basestr) {
    if( ! function_exists('bcadd') ) {
        Throw new Exception('You need the BCmath extension.');
    }

    $base = strlen($basestr);
    $rep = '';

    while( true ){
        if( strlen($num) < 2 ) {
            if( intval($num) <= 0 ) {
                break;
            }
        }
        $rem = bcmod($num, $base);
        $rep = $basestr[intval($rem)] . $rep;
        $num = bcdiv(bcsub($num, $rem), $base);
    }
    return $rep;
}

function bc_arb_decode($num, $basestr) {
    if( ! function_exists('bcadd') ) {
        Throw new Exception('You need the BCmath extension.');
    }

    $base = strlen($basestr);
    $dec = '0';

    $num_arr = str_split((string)$num);
    $cnt = strlen($num);
    for($i=0; $i < $cnt; $i++) {
        $pos = strpos($basestr, $num_arr[$i]);
        if( $pos === false ) {
            Throw new Exception(sprintf('Unknown character %s at offset %d', $num_arr[$i], $i));
        }
        $dec = bcadd(bcmul($dec, $base), $pos);
    }
    return $dec;
}


// base 58 alias
function bc_base58_encode($num) {
    return bc_arb_encode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}
function bc_base58_decode($num) {
    return bc_arb_decode($num, '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
}

//hexdec with BCmath
function bc_hexdec($num) {
    return bc_arb_decode(strtolower($num), '0123456789abcdef');
}
function bc_dechex($num) {
    return bc_arb_encode($num, '0123456789abcdef');
}

а для этого не нужно базу блоков делать с индексом :
тоесть bitcoin-qt НЕ нужно запустить с параметром '-txindex 1' ?