Как получить список транзакций ввода/вывода для биткойн-адреса в формате JSON?

Есть ли пример того, как получить все данные транзакции для биткойн-адреса в формате json?

Ответы (6)

Вы можете использовать API, предоставленный blockchain.info.

Например, используйте https://blockchain.info/rawaddr/$bitcoin_address, чтобы получить все транзакции для адреса в формате JSON.

Как указано выше, вы можете использовать blockchain.info для извлечения результатов. Здесь я хотел бы добавить к решению, предоставленному m1xolyd1an, его код работает нормально, но он извлекает только последние 50 результатов/транзакций, сделанных по адресу, для которого вы пытаетесь получить данные.

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

<?php
$address = $_POST['Address'];
$url = "https://blockchain.info/address/".$address."?format=json&offset=0";
$json = json_decode(file_get_contents($url), true);

$totalTxs = $json["n_tx"];
echo "Total transaction : $totalTxs";
for($ex=0;$ex<$totalTxs;$ex+=50){
//$address = "1HB5XMLmzFVj8ALj6mfBsbifRoD4miY36v";
$url = "https://blockchain.info/address/".$address."?format=json&offset=$ex";
$json = json_decode(file_get_contents($url), true);

//total transactions
$totalTxs = $json["n_tx"];
//final balance
$balanceSatoshis = $json["final_balance"];
$balanceBitcoins = $balanceSatoshis / 100000000;
$balanceBitcoins = number_format($balanceBitcoins, 8);

//loop through each transaction and display all inputs and outs
for($i=0;$i<50;$i++){

echo "<table><tr><td>";
echo "HASH OF TX:</br>";
$hash=$json["txs"][$i]["hash"];
echo "&nbsp;".$hash;

echo "</td><td width='550'>SENT FROM:<br>";
$n_inputs = count($json["txs"][$i]["inputs"]);  

for($ii = 0; $ii < $n_inputs; $ii++){   
    $inValue = $json["txs"][$i]["inputs"][$ii]["prev_out"]["value"];    
    $inValueCalc = $inValue / 100000000;    
    $inAddy = $json["txs"][$i]["inputs"][$ii]["prev_out"]["addr"];  
    echo "&nbsp;". rtrim(number_format($inValueCalc, 8), '0') ."&nbsp;". $inAddy ."&nbsp;"; 
    echo "<br>";
    }   

echo "</td><td>SENT TO:<br>";
$n_outputs = count($json["txs"][$i]["out"]);    

for($io = 0; $io < $n_outputs; $io++){  
    $outValue = $json["txs"][$i]["out"][$io]["value"];  
    $outValueCalc = $outValue / 100000000;  
    $outAddy = $json["txs"][$i]["out"][$io]["addr"];    
    echo "&nbsp;". rtrim(number_format($outValueCalc, 8), '0') ."&nbsp;". $outAddy ."&nbsp;";   
    echo "<br>";    
    }   
echo "</td></tr></table>";
}
}
?>
какой трюк вы использовали, чтобы обойти ограничение в 50?
" blockchain.info/адрес/… ". Я использовал смещение, чтобы получить желаемые результаты. Как и в случае, когда смещение установлено на «0», оно принесет вам последние 50 результатов. Если вы продолжите увеличивать смещение на 50, то впоследствии вы получите предыдущие результаты от более ранних транзакций. Blockchain.info отправляет вам результаты первой страницы при запросе со смещением «0». При запросе со смещением = "50" он отправит вам результаты со второй страницы и так далее. Итак, что я в основном делал, так это повторял смещение, пока не достигну конца или полного отсутствия транзакций.

Ваш вопрос помечен тегом blockchain.info , поэтому вы можете просто использовать конечную точкуhttps://blockchain.info/address/1ADDRESSTOLOOKUPGOESHERE?format=json

На выходе будет представлена ​​первоначальная сводка по адресу, за которой следует каждая транзакция в массиве txs[]со всеми входами и выходами. Вы также запросили пример, поэтому ниже приведен фрагмент ответа.

{
    "hash160":"eaad40023319c547321b63f8adc6cc5a11759c61",
    "address":"1NPrfWgJfkANmd1jt88A141PjhiarT8d9U",
    "n_tx":159,
    "total_received":261352990,
    "total_sent":259703473,
    "final_balance":1649517,
    "txs":[

{
   "ver":1,
   "inputs":[
      {
         "sequence":4294967295,
         "prev_out":{
            "spent":true,
            "tx_index":221676260,
            "type":0,
            "addr":"19hNEoHRGb2wDpxWGgDEDwaoHdEfKjZwWx",
            "value":3214191,
            "n":20,
            "script":"76a9145f635f8cf8ad279cd74eb24a44cd128973e00a0e88ac"
         },
         "script":"47304402207edc4373fbb9a01ac6e07eb88f91c7008e2ed951603a3ce03393d2bf7e99bcbd022060963067a9559cc8b140136dc4f78819731260151ed9d81c19c25ffd8df42b7a01410497e0923c9b2ea5261733f81fa83333d25373db3feae91e15ae42f5347e8f65080c90b33cba4470e5eabec06db30a57b4017ad3588a26722e36249eb5c6679a39"
      }
   ],
   "block_height":454724,
   "relayed_by":"87.128.111.190",
   "out":[
      {
         "addr_tag_link":"http:\/\/wearechange.org\/donate\/",
         "addr_tag":"wearechange.org",
         "spent":false,
         "tx_index":225606846,
         "type":0,
         "addr":"12HdLgeeuA87t2JU8m4tbRo247Yj5u2TVP",
         "value":166948,
         "n":0,
         "script":"76a9140e1d1da1fc5bb5165a54a4d9ecefbc8458bae3d388ac"
      }
   ],

Допустим, вы используете PHP и хотите получить и отобразить все транзакции для определенного адреса. Вы бы вызывали API, а затем перебирали каждый в массиве.

http://phpfiddle.org/main/code/e4jy-rrqt

<?php

$address = "1NPrfWgJfkANmd1jt88A141PjhiarT8d9U";
$url = "https://blockchain.info/address/".$address."?format=json";
$json = json_decode(file_get_contents($url), true);

//total transactions
$totalTxs = $json["n_tx"];
//final balance
$balanceSatoshis = $json["final_balance"];
$balanceBitcoins = $balanceSatoshis / 100000000;
$balanceBitcoins = number_format($balanceBitcoins, 8);

//loop through each transaction and display all inputs and outs
for($i=0;$i<$totalTxs;$i++){

    echo "<table><tr><td width='550'>";
    echo "SENT FROM:<br>";
    $n_inputs = count($json["txs"][$i]["inputs"]);  

    for($ii = 0; $ii < $n_inputs; $ii++){   
        $inValue = $json["txs"][$i]["inputs"][$ii]["prev_out"]["value"];    
        $inValueCalc = $inValue / 100000000;    
        $inAddy = $json["txs"][$i]["inputs"][$ii]["prev_out"]["addr"];  
        echo "<button style='background-color:red;'>". rtrim(number_format($inValueCalc, 8), '0') ."</button><a href='#'>". $inAddy ."</a>";    
        echo "<br>";
        }   
    echo "</td><td>SENT TO:<br>";
    $n_outputs = count($json["txs"][$i]["out"]);    

    for($io = 0; $io < $n_outputs; $io++){  
        $outValue = $json["txs"][$i]["out"][$io]["value"];  
        $outValueCalc = $outValue / 100000000;  
        $outAddy = $json["txs"][$i]["out"][$io]["addr"];    
        echo "<button style='background-color:green;'>". rtrim(number_format($outValueCalc, 8), '0') ."</button><a href='#'>". $outAddy ."</a>";    
        echo "<br>";    
        }   
    echo "</td></tr></table>";
}


?>

Вы можете использовать API блокировщика .

http://btc.blockr.io/api/v1/address/txs/the_address 

Где the_addressнаходится адрес, о котором вы ищете информацию.

Однако это ограничено 200 последними транзакциями.

Здесь у вас есть простой пример Python , который делает это:

from json import loads
from requests import get

url = 'http://btc.blockr.io/api/v1/address/txs/'
btc_addr = '36YKytAqTfq5FbjrBqMwnEdS62eZjB7DV6'

r = get(url + btc_addr)
data = loads(r.content)['data']

print data

Где 36YKytAqTfq5FbjrBqMwnEdS62eZjB7DV6случайно выбранный адрес. Результат будет:

{u'txs':[
   {u'time_utc': u'2017-03-03T08:22:57Z', u'amount': 5,  u'confirmations': 4, u'amount_multisig': 0, 
     u'tx': u'fc8bd6d4bff2c5c07f82939cbf798f4442226f39b607353fe8355cf3170d67b7'}, 
   {u'time_utc': u'2017-01-03T17:14:19Z', u'amount': -10, u'confirmations': 9084, u'amount_multisig': 0, 
     u'tx': u'daa9f8c25ce09240a02df1ac56122bb014eb9f6abe5a22bbfe04ee4fa1afb9cc'}, 
   {u'time_utc': u'2017-01-03T11:10:21Z', u'amount': 10, u'confirmations': 9129, u'amount_multisig': 0, 
     u'tx': u'13362f7a746cfe6481e08155d778bba69c8db706673b99239762f5dca14f18f4'}
], u'limit_txs': 200, u'nb_txs': 3, u'nb_txs_displayed': 3, u'address': u'36YKytAqTfq5FbjrBqMwnEdS62eZjB7DV6'}
ссылка на blockr ведет на coinbase.
blockr.io недавно отключил свой сервер.
bicoin api - listreceivedbyaddress(minconf,include_empty,include_watchonly,address_filter)
return json:
[
  {
    address: '37ngGpLcqbgU3Bov8hjMSzgqBKfLyB3f9r',
    amount: 0.0003039,
    confirmations: 92,
    label: '',
    txids: [
      '76acd9e2b7b79f68c9a4a3a4a5cce3528ee8ae6d383aed069bf03d5e95408ec7'
    ]
  }
]

Я не смог получить данные о транзакциях И общей сумме BTC, пришедших на каждую транзакцию, используя советы на подобных страницах . К счастью, я наткнулся на это , которое прекрасно решает:

$address = 'YOUR BTC ADDRESS';

    $transaction_list=array();
    $satoshi=100000000;
    $txnlist=file_get_contents("https://blockchain.info/rawaddr/".$address);
    if($txnlist)
    {
      $txnlist=json_decode($txnlist,true);
      if($txnlist && isset($txnlist['txs']) && $txnlist['txs'])
      {
        $txns=$txnlist['txs'];
        foreach($txns as $txn)
         {
           $amount=$txn['result']/$satoshi;
           $time=$txn['time'];
           $hash=$txn['hash'];
           $transaction_list[]=array(
             'amount'=>$amount,
             'hash'=>$hash,
             'time'=>$time
           );
         }
        }
     $data['address']=$txnlist['address'];
     $data['total_txn']=$txnlist['n_tx'];
     $data['total_received']=$txnlist['total_received']/$satoshi;
     $data['total_sent']=$txnlist['total_sent']/$satoshi;
     $data['final_balance']=$txnlist['final_balance']/$satoshi;
     $data['transaction_list']=$transaction_list;
    }
    print '<pre>';
    print_r($data);
    die();

Результат:

(
    [address] => XXXXXXXX
    [total_txn] => 2
    [total_received] => 0.00917981
    [total_sent] => 0
    [final_balance] => 0.00917981
    [transaction_list] => Array
        (
            [0] => Array
                (
                    [amount] => 0.00298651
                    [hash] => XXXXXXX
                    [time] => 1235576379
                )

            [1] => Array
                (
                    [amount] => 0.0061933
                    [hash] => XXXXXXXXXX
                    [time] => 1632561967
                )
        )
)