Как быстрее получить входные и выходные данные биткойн-блока, используя JSON RPC или аналогичный

В настоящее время мне требуется почти 1,5 часа, чтобы получить все входные и выходные данные блока биткойнов за январь с использованием JSON RPC. При таком темпе потребуется значительное количество времени, чтобы вернуться к генезису. Я начинаю думать, что использую неправильный вызов API или делаю что-то еще неправильно. Я был бы очень признателен, если бы кто-нибудь из вас мог просмотреть вызовы, которые я использую в настоящее время (вставлено ниже), и, возможно, сказать мне, что я делаю неправильно, или если bitcoind является подходящим клиентом для этого.

from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
import json
import requests
import pprint
import time
import os


objectivestart_time=time.time()
pp= pprint.PrettyPrinter(indent=4)



rpc_user='n'
rpc_password='n'

url=("http://%s:%s@1"%(rpc_user, rpc_password))


def req(payload):
    return requests.post(url,data=json.dumps(payload)).json()


def BlockHash_JsonRPCpayload(number):
    dic={

    "jsonrpc":"2.0",
    "method": "getblockhash",
    "params": [number] ,
    "id": 1 

    }
    return (dic)


def Block_JsonRPCpayload(h):
    dic={

    "jsonrpc":"2.0",
    "method": "getblock",
    "params": [str(h)] ,
    "id": 1 

    }
    return (dic)


def rawtx_JsonRPCpayload(tx):
    dic={

    "jsonrpc":"2.0",
    "method": "getrawtransaction",
    "params": [tx, True] ,
    "id": 1 

    }
    return (dic)

def rawvin_JsonRPCpayload(tx,vin):
    block_payload={

    "jsonrpc":"2.0",
    "method": "getrawtransaction",
    "params": [tx,1] ,
    "id": 1 

    }

    request=req(block_payload)
    value=request['result']['vout'][int(vin)]['value']


    return float(value)

BTC_dic={}


hash_payload=[]
start_time=time.time()

block_start=481101
block_end=490000
start=block_start
end= block_start

while end < block_end:
    block_tries=0
    while True: 
        try:    

            end=start+100
            hash_payload=[]
            print ( 'start', 'end', start, end )
            for i in range(start,end):
                hash_payload.append(BlockHash_JsonRPCpayload(i))


            start_time=time.time()
            print ( 'mark 1 ')
            hash_response=requests.post(url, data=json.dumps(hash_payload)).json()
            print('time to get hash batch',start, "_", end, time.time()-start_time)
            print ( 'success in getting hashes for ranges', start, "_ ", end )

            time.sleep(0.4)

            block_payload=[]
            for i in hash_response:
                h=i['result']
                block_payload.append(Block_JsonRPCpayload(h))
            start_time=time.time()
            block_response=requests.post(url,data=json.dumps(block_payload)).json()
            print ( 'time to get block batch ',start, "_", end, time.time()-start_time)
            print ( 'success in getting blocks for ranges', start, "_ ", end )

            time.sleep(0.4)



            for i in range(len(block_response)):


                block=block_response[i]['result']

                height=block['height']
                print('getting', len(block['tx']),'transactions for block ', height)
                BTC_dic[height]=block
                tx_payload=[]
                for tx in block['tx']:
                    tx_payload.append(rawtx_JsonRPCpayload(tx))

                try_errors=0
                while True:
                    try:
                        #print ( len(tx_payload), 'number of transactions in block ', height)
                        start_time=time.time()
                        transaction=requests.post(url,data=json.dumps(tx_payload)).json()
                        time.sleep(0.5)
                        #print ('time to get tx', time.time()-start_time)
                        print ( 'success in getting transactions for block ', height )
                    except:
                        try_errors+=1
                        print ( '!! Try error !!')
                        print ( try_errors, ' transaction tries for block height', height)
                        time.sleep(3)
                        continue

                    break


                for  i in range(len(transaction)):


                    tx_result=transaction[i]['result']
                    vin=tx_result['vin']
                    vout=tx_result['vout']



                    try:
                        fees=0
                        for j in range(len(vout)):
                            fees -= tx_result['vout'][j]['value']

                        for j in range(len(vin)):

                            vout=vin[j]['vout']
                            txid=vin[j]['txid']

                            vin_error=0
                            while True:
                                try:
                                    value=rawvin_JsonRPCpayload(txid,vout)
                                except:
                                    print ( '!! vin error !!')
                                    print ( 'attempt', vin_error )
                                    vin_error+=1

                                    time.sleep(0.4)
                                    continue
                                break 

                            fees+=value
                            tx_result['vin'][j]['value']=value



                        tx_result['fees']=fees
                    except:
                        tx_result['vin'][0]['value']='No Inputs (Newly Generated Coins)'
                        tx_result['fees']=0


                    BTC_dic[height]['tx'][i]=tx_result



                if len(BTC_dic) >= 100:
                    print ( 'len BTC_dic =', len(BTC_dic))


                    for block in BTC_dic:
                        block_fee=0
                        transactions= BTC_dic[block]['tx']


                        #pp.pprint(transactions)
                        for j in transactions:
                            fee=j['fees']
                            block_fee+=fee
                        BTC_dic[block]['block fees']=block_fee



                    block_array=[]
                    for block in BTC_dic:
                        block_array.append(block)


                    file_name='jcampbell_btc_txdata'+str(min(block_array))+'_'+str(max(block_array))+'.json'
                    print ('saving', file_name, 'time', time.time()-objectivestart_time)

                    with open(file_name, 'w') as outfile:
                        json.dump(BTC_dic,outfile)
                    BTC_dic={}




            start=end



        except:
            block_tries+=1
            print(block_tries, 'tries to get data for block range ', start,"_",end)
            time.sleep(5)
            continue
        break 




for block in BTC_dic:
    block_fee=0
    transactions= BTC_dic[block]['tx']


    #pp.pprint(transactions)
    for j in transactions:
        fee=j['fees']
        block_fee+=fee
    BTC_dic[block]['block fees']=block_fee





block_array=[]
for block in BTC_dic:
    block_array.append(block)


file_name='jcampbell_btc_txdata'+str(min(block_array))+'_'+str(max(block_array))+'.json'
print ('saving', file_name, 'time', time.time()-objectivestart_time)
with open(file_name, 'w') as outfile:
    json.dump(BTC_dic,outfile)

Фон

Если мы хотим, чтобы BTC стал мейнстримом, нам нужен лучший способ показать экономическую активность. Мне нужно, чтобы вы помогли мне доказать, что Биткойн — это больше, чем спекулятивный инструмент.

Я пришел из академических кругов (в частности, из области экономики), и мне часто трудно убедительно описать своим коллегам рост экосистемы Биткойн в цифрах, которые переводятся в экономическую ценность.

Учитывая быстрый рост этого рынка, когда люди думают о биткойнах, цена часто является первым, что приходит на ум. Для тех из нас, кто в течение некоторого времени занимается исследованием биткойнов, шесть тысяч долларов США за биткойн, несомненно, являются невероятным показателем популярности. Однако нам нужна более качественная метрика, чтобы показать фактическую экономическую активность, которая также значительно увеличилась за последние пару лет. Если Биткойн — это одноранговая система электронной наличности, нам нужен лучший индикатор объема BTC между одноранговыми узлами сети . Я начал исследовать биткойн-дни уничтоженных, но мне часто трудно объяснить эту метрику, поскольку она не дает точного ответа на вопрос: сколько ценности обменивается в сети?

Я понимаю, что полностью точный ответ на этот вопрос почти невозможен из-за модели UTXO Биткойна, но нам нужны более точные оценки. Blockchain.info предоставляет приблизительный объем транзакций за день, но случайные выборки, которые я обработал, показывают, что их методология значительно занижает объем. После нескольких месяцев тестирования случайных выборок и ручного просмотра адресов я полагаю, что разработал более точную методологию для оценки объема в сети. Я планирую поделиться этой методологией с сообществом, как только смогу проверить свою гипотезу, используя более полные блоки, но сейчас задача состоит в том, чтобы получить все входные и выходные данные из более поздних блоков.

Я считаю, что более реалистичная оценка объема, подкрепленная проверенной методологией, повысит интерес со стороны академических кругов и повысит доверие к сети Биткойн. Если вы не знакомы с JSON RPC, я был бы признателен, если бы вы могли проголосовать за этот пост, чтобы его увидело больше людей.

Спасибо.

-JC

Добро пожаловать на сайт! Это хороший вопрос, но нам нужно, чтобы вопросы были ясными, чтобы мы могли получить хорошие ответы, поэтому я отредактировал вопрос, чтобы попытаться улучшить ясность. Не стесняйтесь обновлять его, если вы видите какой-либо способ улучшить его.

Ответы (1)

Мне нравится справочная информация и основные предположения, с риском перейти к обсуждению, основанному на ценностях, вместо прямого ответа, как можно улучшить вызовы RPC... :-)

Если мы хотим, чтобы BTC стал мейнстримом, нам нужен лучший способ показать экономическую активность. Мне нужно, чтобы вы помогли мне доказать, что Биткойн — это больше, чем спекулятивный инструмент.

Я пришел из академических кругов (в частности, из области экономики), и мне часто трудно убедительно описать своим коллегам рост экосистемы Биткойн в цифрах, которые переводятся в экономическую ценность.

Во-первых, "кто мы"? Я встречал людей, которые совершенно согласны с тем, что биткойн — это полезный механизм передачи стоимости, который предоставляет мне некоторые функции анонимности и, по-видимому, устойчив к цензуре. Так что он уже будет соответствовать моим требованиям (ценностям), и в этом случае биткойн может быть уже слишком мейнстримным. Когда в игру вступает жадность, и люди слишком ограничены, чтобы создать свою собственную группу с умным изобретением, чтобы извлечь из этого выгоду, тогда законно ли применять «их» правила к «моему» биткойн-миру? (гипотетический вопрос)

Об экономике: имхо, экономическая перспектива в основном ориентирована на прибыль. Что-то должно иметь ценность, чтобы я мог извлечь выгоду из этого или вместе с ним. Если нет внутренней ценности, то и пользы от этого никакой: все равно, что копать яму в пустыне. Похоже, именно это мы и делаем с майнингом биткойнов. Копать ямы... Каждая вторая работа пытается создать что-то ценное, создание скульптуры, рисование картины - в основном в смысле материальных активов. И писать компьютерные программы. В мире биткойнов рытье дыр необходимо для защиты сети, а сама эта идея еще не понята. Вот почему его сравнивают с пузырем тюльпанов в Нидерландах. Значение позади не распознается. Время покажет, является биткойн пузырем или нет.

Провокационный вопрос: действительно ли «нам» нужно убеждать больше людей ценой выше 6000 долларов США? Я бы сказал нет :-) Я зашел в игру на менее чем 100, так что я в порядке (и в основном готов). Играть с биткойнами было моей игрушкой, и мне посчастливилось извлечь из этого выгоду. Но все новички, наверное, заходили по 5800, или 5900, или даже 6000. Они опоздали и потеряли возможности. Так что все эти 58, 59 или 6000 игроков отчаянно ищут способ добиться того же «выигрыша», только без риска и с минимальными усилиями. Я не понимаю, почему у "этих" ребят должно быть это преимущество - они должны оставаться в экономике, изобретать что-то свое, например создавать что-н. ценности для общества, продать его обществу и таким образом разбогатеть. Но сомневаюсь, что они на это способны...

какая стоимость обменивается внутри сети? Я понимаю, что полностью точный ответ на этот вопрос практически невозможен из-за модели UTXO Биткойна.

не уверен, что вы хотите доказать здесь. Поскольку мы можем декомпозировать каждый блок (это публичная книга!), мы можем увидеть транзакции внутри и увидеть, сколько стоимости было перемещено из a в b — независимо от модели UTXO. Просто вы не знаете и никогда не должны знать (анонимность!), как часто я терял свои биткойны или даже сколько адресов у меня есть. Тогда транзакция не означает, что я обменял ценность — может быть, я просто перешел из своего горячего кошелька в свою систему холодного хранения и наоборот. Итак, я прихожу к выводу, что ваши усилия направлены либо на правительство (или на группу интересов), чтобы еще больше контролировать людей. Цель разработки Биткойна состояла в том, чтобы предотвратить подобные вещи. В связи с этим вопрос улучшения RPC/JSON не имеет смысла... Извиняюсь, как не носитель языка, не хочу показаться высокомерным,