So erhalten Sie schneller Ein- und Ausgänge eines Bitcoin-Blocks mit JSON RPC oder ähnlichem

Aktuell benötige ich knapp 1,5 Stunden, um per JSON RPC alle Ein- und Ausgänge eines Bitcoin-Blocks aus dem Januar zu erhalten. Bei diesem Tempo wird es viel Zeit in Anspruch nehmen, bis zur Entstehung zurückzugehen. Ich fange an zu glauben, dass ich den falschen API-Aufruf verwende oder etwas anderes falsch mache. Ich wäre sehr dankbar, wenn jemand von Ihnen die Anrufe überprüfen könnte, die ich derzeit verwende (unten eingefügt) und mir vielleicht sagen könnte, was ich falsch mache, oder ob Bitcoin der geeignete Client dafür ist.

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)

Hintergrund

Wenn wir wollen, dass BTC zum Mainstream wird, brauchen wir eine bessere Möglichkeit, die wirtschaftliche Aktivität zu zeigen. Ich brauche Sie, um zu beweisen, dass Bitcoin mehr als ein spekulatives Instrument ist.

Ich komme aus dem akademischen Bereich (insbesondere Wirtschaftswissenschaften) und finde es oft schwierig, meinen Kollegen das Wachstum des Bitcoin-Ökosystems überzeugend in Zahlen zu beschreiben, die sich in wirtschaftlichem Wert niederschlagen.

Angesichts des schnellen Wachstums dieses Marktes ist der Preis oft das erste, was den Menschen in den Sinn kommt, wenn sie an Bitcoin denken. Für diejenigen von uns, die sich seit einiger Zeit mit Bitcoin beschäftigen, sind sechstausend US-Dollar pro Bitcoin unwiderlegbar ein unglaublicher Indikator für Popularität. Wir brauchen jedoch eine bessere Metrik, um die tatsächliche wirtschaftliche Aktivität darzustellen, die in den letzten Jahren ebenfalls erheblich zugenommen hat. Wenn Bitcoin ein elektronisches Peer-to-Peer-Cash-System ist, brauchen wir einen besseren Indikator für das BTC-Volumen zwischen Netzwerk-Peers . Ich habe angefangen, über Bitcoin Days Destroyed zu recherchieren, aber ich finde es oft schwierig, diese Metrik zu erklären, da sie die Frage nicht genau beantwortet: Wie viel Wert wird innerhalb des Netzwerks ausgetauscht?

Ich verstehe, dass eine vollständig genaue Antwort auf diese Frage aufgrund des UTXO-Modells von Bitcoin fast unmöglich ist, aber wir brauchen genauere Schätzungen. Blockchain.info stellt das geschätzte Transaktionsvolumen pro Tag bereit, aber Zufallsstichproben, die ich verarbeitet habe, zeigen, dass ihre Methodik das Volumen deutlich unterschätzt. Nachdem ich monatelang Zufallsstichproben getestet und Adressen manuell überprüft habe, glaube ich, dass ich eine genauere Methode zur Schätzung des On-Chain-Volumens entwickelt habe. Ich plane, diese Methodik mit der Community zu teilen, sobald ich meine Hypothese mit vollständigeren Blöcken testen kann, aber die Herausforderung besteht jetzt darin, alle Eingaben und Ergebnisse aus neueren Blöcken zu erhalten.

Ich glaube, dass eine realistischere Volumenschätzung, gestützt auf eine Peer-Review-Methode, das Interesse der Wissenschaft steigern und dem Bitcoin-Netzwerk Glaubwürdigkeit verleihen würde. Wenn Sie mit JSON RPC nicht vertraut sind, würde ich mich freuen, wenn Sie diesen Beitrag positiv bewerten könnten, damit mehr Leute ihn sehen.

Vielen Dank.

-JC

Willkommen auf der Seite! Es ist eine gute Frage, aber wir müssen die Fragen klar halten, damit wir gute Antworten erhalten können, also habe ich die Frage bearbeitet, um zu versuchen, die Klarheit zu verbessern. Fühlen Sie sich frei, es zu aktualisieren, wenn Sie eine Möglichkeit sehen, es zu verbessern.

Antworten (1)

Ich mag die Hintergrundinformationen und die zugrunde liegenden Annahmen, mit dem Risiko, in eine wertbasierte Diskussion zu geraten, anstatt direkt zu antworten, wie RPC-Aufrufe verbessert werden können ... :-)

Wenn wir wollen, dass BTC zum Mainstream wird, brauchen wir eine bessere Möglichkeit, die wirtschaftliche Aktivität zu zeigen. Ich brauche Sie, um zu beweisen, dass Bitcoin mehr als ein spekulatives Instrument ist.

Ich komme aus dem akademischen Bereich (insbesondere Wirtschaftswissenschaften) und finde es oft schwierig, meinen Kollegen das Wachstum des Bitcoin-Ökosystems überzeugend in Zahlen zu beschreiben, die sich in wirtschaftlichem Wert niederschlagen.

Das erste ist "wer sind wir"? Ich habe Leute getroffen, die vollkommen in Ordnung sind, dass Bitcoin ein brauchbarer Wertübertragungsmechanismus ist, der mir einige Anonymitätsfunktionen bietet und anscheinend zensurresistent ist. Es würde also bereits meine Anforderungen (Werte) erfüllen, und in diesem Fall könnte Bitcoin bereits zu Mainstream sein. Wenn Gier ins Spiel kommt und die Menschen zu eingeschränkt sind, um ihre eigene Gruppe mit einer cleveren Erfindung zu gründen, von der sie profitieren können, ist es dann legitim, „ihre“ Regeln auf „meine“ Bitcoin-Welt anzuwenden? (hypothetische Frage)

Zur Ökonomie: Imho ist die Perspektive der Ökonomie meist gewinnorientiert. Etwas muss einen Wert haben, damit ich davon oder damit profitieren kann. Wenn es keinen inneren Wert gibt, hat es nichts zu gewinnen: wie ein Loch in der Wüste zu graben. Und das scheint das zu sein, was wir mit dem Bitcoin-Mining tun. Löcher graben... Jede andere Arbeit versucht etwas Wertvolles zu schaffen, eine Skulptur zu basteln, ein Bild zu zeichnen - meist im Sinne von Sachwerten. Und das Schreiben von Computerprogrammen. In der Bitcoin-Welt dient das Graben von Löchern dazu, das Netzwerk zu sichern, diese ganze Idee ist noch nicht verstanden. Deshalb wird es mit der Tulpenblase in den Niederlanden verglichen. Der Wert dahinter wird nicht erkannt. Die Zeit wird ein sehr guter Richter sein, ob Bitcoin eine Blase ist oder nicht.

Eine provokative Frage: Müssen "wir" wirklich mehr Leute überzeugen, mit einem Preis jenseits von 6000 US$? Ich würde nein sagen :-) Ich bin mit weniger als 100 ins Spiel gegangen, also bin ich ok (und meistens fertig). Es war mein Spielzeug, mit Bitcoins zu spielen, und ich hatte das Glück, davon zu profitieren. Aber alle Neulinge sind wahrscheinlich bei 5800 oder 5900 oder sogar 6000 eingestiegen. Sie sind zu spät und haben die Gelegenheiten verpasst. All diese 58-, 59- oder 6000-Einsteiger suchen also verzweifelt nach einem Weg, den gleichen "Gewinn" zu erzielen, nur ohne Risiko und mit sehr wenig Aufwand. Ich verstehe nicht, warum "diese" Typen diesen Vorteil haben sollten - sie sollten in der Wirtschaft bleiben, etwas Eigenes erfinden, zB etwas erschaffen. von Wert für die Gesellschaft, verkaufe es an die Gesellschaft und werde auf diese Weise reich. Aber ich bezweifle, dass sie dazu in der Lage sind...

Wie viel Wert wird innerhalb des Netzwerks ausgetauscht? Ich verstehe, dass eine absolut genaue Antwort auf diese Frage aufgrund des UTXO-Modells von Bitcoin nahezu unmöglich ist

nicht sicher, was Sie hier beweisen wollen. Da wir jeden Block zerlegen können (es ist ein öffentliches Hauptbuch!), können wir die Transaktionen darin sehen und sehen, wie viel Wert von a nach b verschoben wurde - unabhängig vom UTXO-Modell. Du weißt einfach nicht und solltest es nie wissen (Anonymität!), wie oft ich meine Bitcoins fallen gelassen habe oder sogar wie viele Adressen ich besitze. Eine Transaktion bedeutet dann nicht, dass ich Wert getauscht habe - vielleicht bin ich nur von meiner heißen Brieftasche zu meinem kalten Speichersystem gewechselt und umgekehrt. Daher komme ich zu dem Schluss, dass Ihre Bemühungen entweder regierungs- (oder interessengruppen-)orientiert sind, um Einzelpersonen weiter zu kontrollieren. Das Designziel von Bitcoin war es, solche Dinge zu verhindern. In diesem Zusammenhang macht die Frage nach einer Verbesserung von RPC/JSON keinen Sinn ... Entschuldigung, als Nicht-Muttersprachler möchte ich nicht zu arrogant erscheinen,