Cómo obtener entradas y salidas de un bloque bitcoin de forma más rápida, utilizando JSON RPC o similar

Actualmente, me lleva casi 1,5 horas obtener todas las entradas y salidas de un bloque de bitcoin desde enero usando JSON RPC. A este ritmo, tomará una cantidad significativa de tiempo volver al génesis. Estoy empezando a pensar que estoy usando la llamada a la API incorrecta o que estoy haciendo algo mal. Estaría muy agradecido si alguno de ustedes pudiera revisar las llamadas que estoy usando actualmente (pegadas a continuación) y tal vez decirme qué estoy haciendo mal, o si bitcoind es el cliente apropiado para esto.

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)

Fondo

Si queremos que BTC se generalice, necesitamos una mejor manera de mostrar la actividad económica. Necesito que me ayudes a demostrar que Bitcoin es más que un instrumento especulativo.

Provengo de la academia (Economía, específicamente) y, a menudo, me resulta difícil describir de manera convincente a mis compañeros el crecimiento del ecosistema de Bitcoin en números que se traducen en valor económico.

Dado el rápido crecimiento que ha experimentado este mercado, cuando las personas piensan en Bitcoin, el precio es a menudo lo primero que les viene a la mente. Para los que llevamos un tiempo investigando Bitcoin, seis mil dólares americanos por bitcoin es, irrefutablemente, un increíble indicador de popularidad. Sin embargo, necesitamos una mejor métrica para mostrar la actividad económica real, que también ha aumentado sustancialmente en los últimos dos años. Si Bitcoin es un sistema de efectivo electrónico peer-to-peer, necesitamos un mejor indicador del volumen de BTC entre los pares de la red . Empecé a investigar sobre Bitcoin Days Destroyed, pero a menudo me resulta difícil explicar esta métrica, ya que no responde con precisión a la pregunta: ¿cuánto valor se intercambia dentro de la red?

Entiendo que una respuesta completamente precisa a esta pregunta es casi imposible debido al modelo UTXO de Bitcoin, pero necesitamos estimaciones más precisas. Blockchain.info proporciona un volumen estimado de transacciones por día, pero las muestras aleatorias que procesé indican que su metodología subestima significativamente el volumen. Después de meses de probar muestras aleatorias y mirar manualmente las direcciones, creo que he desarrollado una metodología más precisa para estimar el volumen en la cadena. Planeo compartir esta metodología con la comunidad una vez que pueda probar mi hipótesis usando bloques más completos, pero el desafío ahora es obtener todas las entradas y salidas de bloques más recientes.

Creo que una estimación de volumen más realista respaldada por una metodología revisada por pares aumentaría el interés de la academia y agregaría credibilidad a la red de Bitcoin. Si no está familiarizado con JSON RPC, le agradecería que votara a favor de esta publicación para que más personas la vean.

Gracias.

-JC

Bienvenido al sitio! Es una buena pregunta, pero debemos mantener las preguntas claras para que podamos obtener buenas respuestas, por lo que he editado la pregunta para tratar de mejorar la claridad. Siéntete libre de actualizarlo si ves alguna forma de mejorarlo.

Respuestas (1)

Me gusta la información de fondo y las suposiciones subyacentes, con el riesgo de entrar en una discusión basada en el valor, en lugar de responder directamente, cómo se pueden mejorar las llamadas RPC... :-)

Si queremos que BTC se generalice, necesitamos una mejor manera de mostrar la actividad económica. Necesito que me ayudes a demostrar que Bitcoin es más que un instrumento especulativo.

Provengo de la academia (Economía, específicamente) y, a menudo, me resulta difícil describir de manera convincente a mis compañeros el crecimiento del ecosistema de Bitcoin en números que se traducen en valor económico.

Lo primero es "¿quiénes somos nosotros"? Conocí a personas que están perfectamente de acuerdo, que bitcoin es un mecanismo de transferencia de valor utilizable, que me brinda algunas características de anonimato y aparentemente es resistente a la censura. Por lo tanto, ya cumpliría mis requisitos (valores) y, en este caso, Bitcoin podría ser demasiado convencional. Cuando la codicia entra en juego, y las personas están demasiado limitadas para crear su propio grupo con una invención inteligente para beneficiarse, ¿es legítimo aplicar "sus" reglas a "mi" mundo bitcoin? (pregunta hipotética)

Sobre economía: en mi humilde opinión, la perspectiva de la economía está principalmente orientada a la ganancia. Algo debe tener un valor, para que pueda ganar de o con él. Si no hay un valor intrínseco, nada que ganar con él: como cavar un hoyo en el desierto. Y esto parece ser lo que hacemos con la minería de Bitcoin. Cavando agujeros... Todos los demás trabajos intentan crear algo con valor, elaborando una escultura, dibujando una imagen, principalmente en el sentido de activos tangibles. Y escribir programas de computadora. En el mundo de bitcoin, cavar agujeros es asegurar la red, toda esta idea aún no se entiende. Por eso se compara con la burbuja de los tulipanes en los Países Bajos. No se reconoce el valor que hay detrás. El tiempo será un muy buen juez, si Bitcoin es o no una burbuja.

Una pregunta provocadora: ¿realmente "nosotros" necesitamos convencer a más gente, con un precio superior a los 6000 US$? Diría que no :-) Entré en el juego a menos de 100, así que estoy bien (y casi terminado). Era mi juguete para jugar con bitcoins, y tuve la suerte de beneficiarme de él. Pero todos los recién llegados probablemente ingresaron en 5800, 5900 o incluso 6000. Llegaron demasiado tarde y perdieron las oportunidades. Así que todos estos chicos de 58, 59 o 6000 entradas están buscando desesperadamente una manera de lograr la misma "ganancia", solo que sin riesgo y con muy poco esfuerzo. No veo por qué "estos" muchachos deberían tener este beneficio: deberían permanecer en la economía, inventar algo por su cuenta, por ejemplo, crear algo. de valor para la sociedad, venderlo a la sociedad y hacerse rico de esta manera. Pero dudo que sean capaces de hacerlo...

¿Cuánto valor se intercambia dentro de la red? Entiendo que una respuesta completamente precisa a esta pregunta es casi imposible debido al modelo UTXO de Bitcoin.

No estoy seguro de lo que quieres probar aquí. Como podemos descomponer cada bloque (¡es un libro mayor público!), podemos ver las transacciones dentro y ver cuánto valor se movió de a a b, independientemente del modelo UTXO. Simplemente no sabe, y nunca debería saber (¡anonimato!), con qué frecuencia volqué mis bitcoins, o incluso cuántas direcciones poseo. Entonces, una transacción no significa que haya intercambiado valor, tal vez simplemente cambié de mi billetera caliente a mi sistema de almacenamiento en frío, y viceversa. Así que llegué a la conclusión de que su esfuerzo está orientado al gobierno (o grupo de interés) para controlar aún más a las personas. El objetivo del diseño de Bitcoin era evitar cosas como esta. En este sentido, la cuestión de mejorar RPC/JSON no tiene sentido... Disculpas, como hablante no nativo no quiero parecer demasiado arrogante,